Django:如果相关对象不存在,则从OneToOneField返回“None” [英] Django: Return 'None' from OneToOneField if related object doesn't exist?

查看:191
本文介绍了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):
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
pre>

使用它:

  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 no Egg related to the Breakfast?

Edit: Forgot to mention: I'd rather not change the related_name to something like related_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆