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

epa*_*alm 3 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.
Run Code Online (Sandbox Code Playgroud)

我在执行时得到了上面的RelatedObjectDoesNotExist if self.parent is None.我也试过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__.

如果我不能检查它是否为"我怎么能"给它一个值,如果它是无"?

Dan*_*man 8

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

if self.parent_id is None:
Run Code Online (Sandbox Code Playgroud)