Как сохранить модель Django с отношениями manyToMany Through и регулярными отношениями manyToMany - PullRequest
1 голос
/ 05 февраля 2012

Я прочитал все, что могу найти о связях 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:
        ...

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

Кто-нибудь знает, как сохранить обаэти вещи?Я хотел бы избежать обращения к сырому SQL.

1 Ответ

1 голос
/ 05 февраля 2012

Почему бы вам просто не удалить through ManyToManyField из вашего ModelForm?

class MyForm(forms.ModelForm):
    class Meta:
        exclude = ('book',)
        model = Treatment
...