我想为 Django 的默认 User 类定义一个代理模型,如下所示:
class MyUser(User):
def pretty_username(self):
if self.first_name:
return self.first_name
return self.username
class Meta:
proxy = True
而且,我希望能够从视图代码(理想情况下,甚至从模板)调用 Pretty_username 。是否有一种简单的方法来获取标准用户模型的实例并将其类型转换为 MyUser 的实例?
甚至有一些__init__
魔法对我来说没问题,只要我能说:
my_user = MyUser(request.user)
在我看来代码。
我认为这个问题的实际答案应该是@fhahn 在另一个答案中的评论。并通过改变class我们可以避免额外的数据库调用。这是示例代码:
我的代理模型改变了表示username
to email
if set:
class MyUser(User):
class Meta:
proxy = True
verbose_name = _('my user')
verbose_name_plural = _('my users')
def __str__(self):
return "%s" % (self.email or self.username)
class Wallet(models.Model):
owner = models.OneToOneField(MyUser, on_delete=models.PROTECT, related_name='wallet')
def __str__(self):
return "%s" % self.owner
shell 中的简单测试:
>>> from django.contrib.auth.models import User
>>> from my_apps.models import MyUser
>>> user = User.objects.get(pk=4)
>>> user
<User: AbKec6rumI9H9UmAC3Bh2kXUHzj4>
>>> user.email
'[email protected] /cdn-cgi/l/email-protection'
>>> user.wallet
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'User' object has no attribute 'wallet'
>>> user.__class__ = MyUser
>>> user
<MyUser: [email protected] /cdn-cgi/l/email-protection>
>>> user.wallet
<Wallet: [email protected] /cdn-cgi/l/email-protection>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)