我有一个类似这样的Django类:
class Breakfast(m.Model):
# egg = m.OneToOneField(Egg)
...
class Egg(m.Model):
breakfast = m.OneToOneField(Breakfast, related_name="egg")
如果没有与Breakfast
相关的Egg
,是否可能有breakfast.egg == None
?
编辑:忘了提:我宁愿不把related_name
改为类似related_name="_egg"
的东西,然后有这样的东西:
@property
def egg(self):
try:
return self.egg
except ...:
return None
因为我在查询中使用名称egg
,我不想将查询更改为使用_egg
。
6条答案
按热度按时间j1dl9f461#
这个自定义的django字段将完全按照你的要求执行:
使用它:
zte4gxcn2#
我刚刚遇到了这个问题,并找到了一个奇怪的解决方案:如果选择_related(),则如果不存在相关行,则属性将为None,而不是引发错误。
我不知道这是否可以被认为是一个稳定的功能。
xlpyo6sf3#
我知道在ForeignKey上,当你想让模型不指向任何其他模型时,你可以使用
null=True
。OneToOne只是ForeignKey的一个特例:bksxznpy4#
Django 1.10解决方案由Fedor在接受的答案:
nwo49xxi5#
OmerGertel已经指出了
null
选项。然而,如果我正确理解了你的逻辑模型,那么你实际上需要的是一个从早餐到鸡蛋的 * 唯一且可空的 * 外键。所以一份早餐可能有也可能没有鸡蛋,一个特定的鸡蛋只能与一份早餐联系起来。我使用了这个模型:
这个admin定义:
然后我可以在编辑页面中创建并分配一个鸡蛋作为早餐,或者干脆不分配。在后一种情况下,早餐的鸡蛋属性是无。一个特定的鸡蛋已经分配给一些早餐不能选择另一个。
编辑:
正如OmerGertel在他的评论中所说,你也可以这样写:
yebdmbv46#
我建议在需要访问
Breakfast.egg
时使用try
/except Egg.DoesNotExist
;这样做可以让阅读你代码的人清楚地知道发生了什么,这是Django处理不存在记录的规范方法。如果你真的不想让你的代码被
try
/except
s弄得一团糟,你可以在Breakfast
上定义一个get_egg
方法,如下所示:这将使阅读您的代码的人更清楚地知道eggs是派生的,并且它可能暗示当调用
Breakfast.get_egg()
时执行查找的事实。就我个人而言,我会选择前一种方法,以使事情尽可能清晰,但我可以理解为什么人们可能倾向于使用后一种方法。