У меня странная проблема. Я пытаюсь проверить одну форму, отправленную через 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
, я проверил это) с идентификатором недавно сохраненного Книга
запись.
Есть ли у вас какие-либо идеи, как я могу установить внешний ключ с проверенной и несохраненной формой, чтобы я мог безопасно сохранить его в базе данных?