如果反向关系不存在,为什么Django会停止执行?

时间:2018-10-22 21:42:52

标签: python django

我有一个常见的情况:一个用户模型和一个雇员模型,它们通过user_id上的一对一关系与用户相关。我的用户模型是自定义的,其中之一是方法“ is_employee”:

class User(AbstractUser):
    def is_employee(self):
        print(self.id)
        print(self.employee is not None)
        return self.employee is not None
    is_employee.boolean = True
    is_employee.short_description = _('Employee status')


class Employee(AddressMixin, models.Model):
    user        = OneToOneField(User, 
                                primary_key=True, 
                                related_name='employee',
                                on_delete=CASCADE)
    phone_no    = models.CharField(max_length=20, 
                                   blank=True, 
                                   default='')
    mobile_no   = models.CharField(max_length=20, 
                                   blank=True, 
                                   default='')

我在User.is_employee的管理站点中使用list_display。问题在于,函数User.is_employee仅在该用​​户有Employee的情况下返回结果。如果没有,则它在第一次遇到呼叫self.employee蚂蚁的地方停止执行,从而返回None。这是我在管理员身上看到的内容: Employee status for the last user last user is not False but None

很抱歉,这个问题很麻烦。我是Django的新手,这也是我在该网站上的第一篇文章。预先谢谢你。

1 个答案:

答案 0 :(得分:0)

在没有相关员工的情况下,执行self.employee会引发ObjectDoesNotExist异常。您的情况是捕获到异常,并且表中显示了-

您可以使用hasattr来检查用户是否具有相关的employee,而不会引发异常。

def is_employee(self):
    return hasattr(self, 'employee')

有关更多信息,请参见docs on one-to-one relationships