Django检查相关对象是否存在错误:RelatedObjectDoesNotExist


77

has_related_object我的模型中有一个方法需要检查相关对象是否存在

class Business(base):
      name =  models.CharField(max_length=100, blank=True, null=True)

  def has_related_object(self):
        return (self.customers is not None) and (self.car is not None)


class Customer(base):
      name =  models.CharField(max_length=100, blank=True, null=True)
      person = models.OneToOneField('Business', related_name="customer")

但是我得到了错误:

Business.has_related_object()

RelatedObjectDoesNotExist:公司没有客户。


1
我不敢相信Django不提供这种方法。
etlds

Answers:


75

这是因为ORM必须去数据库检查是否customer存在。由于它不存在,因此引发异常。

您必须将方法更改为以下内容:

def has_related_object(self):
    has_customer = False
    try:
        has_customer = (self.customers is not None)
    except Customer.DoesNotExist:
        pass
    return has_customer and (self.car is not None)

我不知道这种情况,self.car因此如果需要,我会留给您进行调整。

旁注:如果在Model具有ForeignKeyField或的OneToOneField上执行此操作,则可以作为快捷方式执行以下操作,以避免数据库查询。

def has_business(self):
    return self.business_id is not None

1
请注意,根据文档(docs.djangoproject.com/en/1.9/ref/models/fields/…),“ [...]您的代码永远不必处理数据库列名,除非您编写自定义SQL您将始终处理模型对象的字段名称。”
Antoine Pinsard '16

这种方法比其他答案要快,因为它不需要与数据库对话。

4
@AntoinePinsard,在这种情况下使用列名会更快,因为Django不会尝试在基础查询中进行联接。Django鼓励这些做法以进行必要的优化。 docs.djangoproject.com/en/2.1/topics/db/optimization / ...
Bobort

1
None如果您尝试查询对象的关系之一,为什么Django不只返回?抛出异常似乎过多。
mecampbellsoup

2
它很可能涵盖了具有可为空字段的情况。允许为null时,它返回None。如果不是,则引发异常。
schillingt

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.