【发布时间】:2020-01-22 12:20:27
【问题描述】:
我正在尝试在pre_save 方法中设置一个不可为空的 OneToOneField 对象(尚未设置)。
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 引用,所以当 save 以某种方式执行时,它认为它不应该保存 b 属性。
任何想法如何做到这一点?
【问题讨论】:
-
似乎您想在刚刚创建 A 时创建对 B 的引用,对吗?所以我认为你可以将其设置为 Nullable,并通过 pre_save 信号创建对 B 的引用
-
我已经尝试过,如问题的最后部分所述
-
instance.b,当您将字段设置为可为空时,这不会引发任何错误。试试
if not instance.b: #Create new B。 -
这不是问题。问题是我创建了新的 B
if not instance.b: instance.b = B()但在保存.b属性后仍然是None(尽管 B 已创建) -
你给
instance.save()打过电话吗@这个将提交实例上的所有更改。
标签: django django-orm django-signals