要使用自定义字段扩展User对象,Django文档建议使用UserProfiles。但是,根据this回答一年左右的问题回答:
扩展django.contrib.auth.models.User现在也运行得更好 - 自从模型API中重构Django的继承代码以来。
诸如this之类的文章阐述了如何使用自定义字段扩展User模型以及优势(直接从用户对象检索属性,而不是通过.get_profile())。
所以我想知道在这个问题上是否有任何共识,或者使用其中一个的原因。或者甚至是Django团队目前的想法?
答案 0 :(得分:8)
我投票赞成使用 UserProfiles 。
我使用了几个第三方应用。并且用户的外键始终指向auth.models.User。
示例:强>
class Article(models.Model):
user = models.ForeignKey('auth.User') # instead of your CustomUser
text = ....
您的自定义用户模型:
class CustomUser(User):
timezone = models.CharField(max_length=50, default='Europe/London')
# Use UserManager to get the create_user method, etc.
objects = UserManager()
如果您通过Article实例访问用户字段会发生什么? 这将引发异常:
u = a_article.user
u.timezone
AttributeError: 'User' object has no attribute 'timezone'
也许这对你来说不是问题,你不想避免额外的数据库查询。 但我会使用get_profile方式。
2013年5月更新
自Django 1.5以来,您可以extend使用默认的用户模型,或substitute使用完全自定义的模型。
2016年11月更新
上述解决方案已过时,请参阅wim的评论
答案 1 :(得分:2)
以下是James Bennett中blog entry about model inheritance所说的内容:
我敢打赌,通过定义一个相关的模型并将其与一个唯一的外键链接起来,可能会有90%或更多人说他们想要用子类做的事情。
所以我认为最好的方法仍然是使用外部应用,例如Pinax的某些组件或django-profiles应用(最初来自同一个James Bennett)。