我有一个模型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'不同,因为它使用了元类。
答案 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_name
和lucy_guide.last_name
进行访问。