在save()中读取外键引用会引发RelatedObjectDoesNotExist

时间:2018-05-10 12:25:47

标签: 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__

如果我无法检查它是否为“无”,我怎么能“给它一个值”?

1 个答案:

答案 0 :(得分:7)

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

if self.parent_id is None: