将属性委托给Django中OneToOneField的属性

时间:2018-03-30 23:29:38

标签: python django

我有一个模型UserGuide,它通过一对一的关系扩展了Django的User模型。我想这样,对于实例lucy_guide,对属性lucy_guide.first_name的调用将返回luyy_guide.user.first_name(类似于last_name)。这是我实现这个的第一步:

class LucyGuide(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    def __getattr__(self, attr):
        if attr in ['first_name', 'last_name'] and self.user:
            return getattr(self.user, attr)
        return super().__getattr__(attr)

这看起来不错吗?我知道Django的行为可能与'常规Python'不同,因为它使用了元类。

1 个答案:

答案 0 :(得分:2)

我建议您只在模型上定义显式属性,而不是弄乱__getattr__

class LucyGuide(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    @property
    def first_name(self)
        return self.user.first_name

    @property
    def last_name(self)
        return self.user.last_name

然后您可以使用lucy_guide.first_namelucy_guide.last_name进行访问。