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

时间:2014-11-21 14:59:04

标签: python django

我的模型中有一个方法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:业务没有客户。

3 个答案:

答案 0 :(得分:107)

使用hasattr(self, 'customers')避免异常检查为recommended in Django docs

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

答案 1 :(得分:43)

这是因为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的情况,所以如果需要,我会留给你调整它。

旁注: 如果您在具有ForeignKeyField或OneToOneField的模型上执行此操作,则可以执行以下操作以避免数据库查询。

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

答案 2 :(得分:0)

您之前可能在调试时创建了用户并且没有配置文件,所以即使现在编码自动化之后,他们仍然没有配置文件尝试在您的 signal.py 文件中尝试以下代码,然后创建一个超级用户,以身份登录超级用户,然后从那里添加第一个帐户的个人资料。这对我有用...

@receiver(post_save, sender=User, dispatch_uid='save_new_user_profile')
def save_profile(sender, instance, created, **kwargs):
    user = instance
    if created:
        profile = UserProfile(user=user)
        profile.save()