django - установка необнуляемого поля в pre_save - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь установить необнуляемый объект OneToOneField (который не был установлен) в методе pre_save.

class A(Model):
    b = models.OneToOneField(B, on_delete=CASCADE)

    @staticmethod
    def pre_save(sender, instance, **kwargs):
        try:
            instance.b
        except RelatedObjectDoesNotExist:
            instance.b = B()
            instance.b.save()

pre_save.connect(A.pre_save, A)

Даже если объект B создается и сохраняется в базе данных, Я получаю эту ошибку, как будто объект A не указывает на B

django.db.utils.IntegrityError: NOT NULL constraint failed: app_a.b_id

Если я установлю null=True в определении поля, конечно, я не получаюNOT NULL constraint failed ошибка.Но, тем не менее, объект A не хранит ссылку на объект B.

Я предполагаю, что это потому, что в исходном объекте A нет ссылки на B, поэтому, когда сохранение выполняется каким-либо образом, оно не 'Я думаю, что это должно сохранить свойство b.

Есть идеи, как это сделать?

1 Ответ

0 голосов
/ 22 сентября 2019

Итак, я нашел источник проблемы!

Эта ошибка возникает, когда вы назначаете объект перед его сохранением.Если вы сохраните объект и назначите его позже, он сохранит объект правильно:

b = B()
b.save()
instance.b = b
...