我想这是设计使然,但这是我的场景:如果保存一个没有父级的子级,我想创建一个新的父级。
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/