【问题标题】:django - setting a non-nullable field in pre_savedjango - 在 pre_save 中设置一个不可为空的字段
【发布时间】: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


【解决方案1】:

所以,我找到了问题的根源!

当您在保存之前分配对象时会发生此错误。如果您保存对象并稍后分配它,它会正确保存对象:

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

【讨论】:

    猜你喜欢
    • 2021-03-06
    • 2011-09-21
    • 2021-03-22
    • 2019-04-04
    • 2015-03-16
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    相关资源
    最近更新 更多