python - 在 save() 重写中读取外键引用引发 RelatedObjectDoesNotExist

标签 python django django-models

我想这是设计使然,但这是我的场景:如果保存一个没有父级的子级,我想创建一个新的父级。

class Parent(models.Model):
    pass

class Child(models.Model):
    parent = models.ForeignKey(Parent, on_delete=models.PROTECT, related_name='children')

    def save(self, *args, **kwargs):
        if self.parent is None: # error happens here
            self.parent = Parent.objects.create()
        super().save(*args, **kwargs)

c = Child()
c.save()
# django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist: Child has no parent.

我在执行 if self.parent is None 时得到上面的 RelatedObjectDoesNotExist。我也试过 if not self.parent ,同一行出现同样的错误。我真的不想让父字段可以为空。仅仅读取 self.parent 的行为,甚至检查它是否为 None,就足以触发错误。

这是在 Django 1.11 中,这里是引发错误的地方:https://github.com/django/django/blob/2b882a4bd954c8a6b1447f8fc0841a3352514c26/django/db/models/fields/related_descriptors.py#L193 ,所以如果我没看错的话,只要阅读 self.parent,我就会在 __get__ 中结束。

如果我不能检查它是否为 None,我如何“给它一个值,如果它是 None”?

最佳答案

问题是访问 FK 本身会导致数据库查找失败。为避免这种情况,请访问底层 ID 字段:

if self.parent_id is None:

关于python - 在 save() 重写中读取外键引用引发 RelatedObjectDoesNotExist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50272980/

相关文章:

python - rw+ 和 r+ 有什么区别

python - 下载文件并在响应中重定向

python - 基于模型的__str__的django过滤器查询集

python - 就地分区不适用于重复元素

python - AWS Sagemaker - PCA 模型未部署

Django:我在 syncdb 后收到 [关系 "auth_group"不存在] 错误

python - 使用 django 编码字符串作为 django 信号的发送者

python - 比较 Django 模型中的旧字段和更新字段

Django:如何使用 settings.AUTH_USER_MODEL 执行查询?

python - 相关类型字段未显示值