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

在我的模型中有一个方法 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")

但我得到了一个错误:

Has _ related _ object ()

RelatedObjectDoesNotExist: 业务没有客户。

80748 次浏览

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

Side note: 如果您是在 Model上执行此操作,而 Model上有 ForeignKeyFieldOneToOneField,则可以执行以下操作作为避免数据库查询的快捷方式。

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

使用 hasattr(self, 'customers')可以避免像 Django 文件中推荐的那样进行异常检查:

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

你可能已经创建了用户之前调试和没有配置文件,所以即使现在编码的自动化后,他们仍然没有配置文件尝试下面的代码在您的 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()

虽然这是一个老问题,但我认为这对于寻找处理这种类型异常的人是有帮助的,特别是当您想检查 OneToOne 关系时。

我的解决方案是使用 django.core.exceptions中的 ObjectDoesNotExist:

from django.core.exceptions import ObjectDoesNotExist


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


def has_related_object(self):
try:
self.customers
self.car
return True
except ObjectDoesNotExist:
return False




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