Django:如果相关对象不存在,则从OneToOneField返回“None” [英] Django: Return 'None' from OneToOneField if related object doesn't exist?
本文介绍了Django:如果相关对象不存在,则从OneToOneField返回“None”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
class Breakfast(m.Model):
# egg = m.OneToOneField(Egg)
...
class Egg(m.Model):
breakfast = m.OneToOneField(Breakfast,related_name =egg)
有可能有 breakfast.egg == None
如果没有 Egg
相关的早餐
?
编辑:忘记提到:我宁愿不要将 related_name
更改为 related_name =_ egg
,然后具有以下内容:
@property
def egg(self)
try:
return self.egg
except ...:
return无
因为我在查询中使用了名字 egg
,我宁可不必将查询更改为使用 _egg
。
解决方案
此自定义django字段将完全正确帽子你想要的:
class SingleRelatedObjectDescriptorReturnsNone(SingleRelatedObjectDescriptor):
pre>
def __get __(self,* args,** kwargs) :
try:
return super(SingleRelatedObjectDescriptorReturnsNone,self).__ get __(* args,** kwargs)
except ObjectDoesNotExist:
return None
class OneToOneOrNoneField(models.OneToOneField):
如果相关对象不存在,则返回None的一个OneOneField
related_accessor_class = SingleRelatedObjectDescriptorReturnsNone
使用它:
class Breakfast(models.Model )
通过
#其他字段
类Egg(m.Model):
早餐= OneToOneOrNoneField(早餐,related_name =egg)
早餐=早餐()
assert breakfast.egg ==无
I've got a Django class like this:
class Breakfast(m.Model): # egg = m.OneToOneField(Egg) ... class Egg(m.Model): breakfast = m.OneToOneField(Breakfast, related_name="egg")
Is it possible to have
breakfast.egg == None
if there is noEgg
related to theBreakfast
?Edit: Forgot to mention: I'd rather not change the
related_name
to something likerelated_name="_egg"
, then have something like:@property def egg(self): try: return self.egg except ...: return None
Because I use the name
egg
in queries, and I'd rather not have to change the queries to using_egg
.解决方案This custom django field will do exactly what you want:
class SingleRelatedObjectDescriptorReturnsNone(SingleRelatedObjectDescriptor): def __get__(self, *args, **kwargs): try: return super(SingleRelatedObjectDescriptorReturnsNone, self).__get__(*args, **kwargs) except ObjectDoesNotExist: return None class OneToOneOrNoneField(models.OneToOneField): """A OneToOneField that returns None if the related object doesn't exist""" related_accessor_class = SingleRelatedObjectDescriptorReturnsNone
To use it:
class Breakfast(models.Model): pass # other fields class Egg(m.Model): breakfast = OneToOneOrNoneField(Breakfast, related_name="egg") breakfast = Breakfast() assert breakfast.egg == None
这篇关于Django:如果相关对象不存在,则从OneToOneField返回“None”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文