Как да запазите django модел с многокъм-много отношения чрез връзка и редовни много-към-много отношения

Прочетох всичко, което мога да намеря за отношенията ManyToMany в Django, но досега не виждам нищо, което да решава конкретния ми проблем с наличието на връзка ManyToMany-Through заедно с проста ManyToMany, която Django обработва толкова безпроблемно сам.

Помислете за тези модели:

class Treatment(models.Model):
    ...
    book = models.ManyToManyField(Book, through='TreatmentLocation')
    category = models.ManyToManyField(Category)

class Book(models.Model):
    name = models.CharField(...)

class TreatmentLocation(models.Model):
    treatment = models.ForeignKey(Treatment)
    book = models.ForeignKey(Book)
    page = models.CharField(...)

class Category(models.Model):
    name = models.CharField(...)

Имам добре данните, които идват в POST масива, но справянето с View се оказва трудно.

def save_treatment(request):
    form = TreatmentForm(request.POST)

    if form.is_valid():
        treatment = form.save()

        pages = request.POST.getlist('page')
        books = request.POST.getlist('book')

        counter = 0
        for page in pages:
            book_id = books.__getitem__(counter)
            TreatmentLocation.objects.create(treatment_id=treatment.id, book_id=book_id, page=page)
            counter = counter + 1

        form.save_m2m()
    else:
        ...

Лечението се записва успешно, както и TreatmentLocations, но след като се опитам да извикам save_m2m(), за да съхраня xrefs на категорията на лечение, получавам грешката Cannot set values on a ManyToManyField which specifies an intermediary model. Use TreatmentLocation Manager.

Някой знае ли как да спася и двете неща? Бих искал да избегна прибягването до необработен SQL.


person Craig Labenz    schedule 05.02.2012    source източник
comment
Вярвам, че в поста си отговарям на въпроса ви. Ето: stackoverflow.com/questions/26608903/   -  person Ronaldo Bahia    schedule 29.10.2014


Отговори (1)


Защо просто не премахнете through ManyToManyField от вашия ModelForm?

class MyForm(forms.ModelForm):
    class Meta:
        exclude = ('book',)
        model = Treatment
person Yuji 'Tomita' Tomita    schedule 05.02.2012
comment
Така че сте го премахнали и моделът записва първото M2M поле. Как се справяте със запазването на „чрез“ M2M? - person automagic; 07.03.2013