在 Django 中扩展用户对象:用户模型继承还是使用 UserProfile?
Posted
技术标签:
【中文标题】在 Django 中扩展用户对象:用户模型继承还是使用 UserProfile?【英文标题】:Extending User object in Django: User model inheritance or use UserProfile? 【发布时间】:2011-02-15 00:48:27 【问题描述】:要使用自定义字段扩展用户对象,Django 文档建议使用UserProfiles。但是,根据this 对大约一年前关于此问题的回答:
扩展 django.contrib.auth.models.User 现在也工作得更好——自从在模型 API 中重构 Django 的继承代码。
诸如this 之类的文章阐述了如何使用自定义字段扩展用户模型,以及优点(直接从用户对象中检索属性,而不是通过 .get_profile())。
所以我想知道在这个问题上是否有任何共识,或者有理由使用其中一个。或者是 Django 团队目前的想法?
【问题讨论】:
Extending the User model with custom fields in Django的可能重复 注意:问题中提到的建议是针对过时版本的 Django。有关新 Django 版本的指南,请参阅上面的链接问题。 【参考方案1】:我投票赞成使用 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()
如果您通过文章实例访问用户字段会发生什么? 这将引发异常:
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的评论
【讨论】:
这将在 django 1.7 迁移中产生依赖问题 这些天来,任何第三方应用程序应该将settings.AUTH_USER_MODEL
作为关系,如果他们硬编码'auth.User'
,那就是第三方的错..【参考方案2】:
这是James Bennett 在blog entry about model inheritance 中所说的:
我敢打赌,通过定义一个相关模型并将其与唯一的外键链接回来,可能 90% 或更多的人们说他们想对子类做的事情可以更好地完成。
所以我认为最好的方法仍然是使用外部应用程序,例如 Pinax 的某些组件,或 django-profiles 应用程序(最初来自同一个 James Bennett)。
【讨论】:
以上是关于在 Django 中扩展用户对象:用户模型继承还是使用 UserProfile?的主要内容,如果未能解决你的问题,请参考以下文章
django-oauth2-provider与自定义用户模型?