Сохранение вложенных форм в Django

У меня странная проблема. Я пытаюсь проверить одну форму, отправленную через POST-запрос, и эта форма фактически построена на основе четырех моделей.

Идея состоит в том, чтобы проверить все формы, а затем сохранить их в соответствующем порядке, назначив внешние ключи на основе недавно сохраненных экземпляров модели.

Проблема возникает, когда я пытаюсь присвоить значение внешнему ключу модели, которая была должным образом проверена с помощью вызова form.is_valid(). Однако он выдает IntegrityError, говоря, что этот конкретный внешний ключ «не может быть NULL».

Ниже приведен код, который должен дать вам представление о том, что я делаю:

Определения моделей и форм:

class Author(models.Model):
    name = models.CharField(blank=False, max_length=150)
    book = models.OneToOneField('Book')  # its important, one author has one book

class Book(models.Model):
    name = models.CharField(blank=False, max_length=150)

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        exclude = ('book',)

class BookForm(ModelForm):
    class Meta:
        model = Book

В одном из представлений:

if request.method == "POST":
    author_form = AuthorForm(request.POST, prefix='author')
    book_form = BookForm(request.POST, prefix='book')
    if author_form.is_valid() and book_form.is_valid():
        book = book_form.save()
        author_form.cleaned_data['book_id'] = book.id
        author.form.save()  # Error!

Во время author_form.save()Я получаю сообщение об ошибке, похожее на это:

IntegrityError at /api/my_method
myapp_author.book_id may not be NULL

Я полностью уверен, что book.idявляется целым числом ( int, я проверил это) с идентификатором недавно сохраненного Книгазапись.

Есть ли у вас какие-либо идеи, как я могу установить внешний ключ с проверенной и несохраненной формой, чтобы я мог безопасно сохранить его в базе данных?

5
задан Tadeck 29 March 2012 в 13:12
поделиться