扩展Django中的User对象:用户模型继承还是使用UserProfile?

Chr*_*ris 16 django django-users

要使用自定义字段扩展User对象,Django文档建议使用UserProfiles.但是,根据这个问题回答一年左右的问题:

扩展django.contrib.auth.models.User现在也更好 - 自从Django的继承代码重构在模型API中以来.

和诸如物品布局如何与优点延伸,以与自定义字段的用户模型,一起(,而不是通过.get_profile直接从用户对象检索属性()).

所以我想知道在这个问题上是否有任何共识,或者使用其中一个的原因.甚至Django团队目前的想法是什么?

mae*_*rsu 8

我投票使用UserProfiles.

我使用了几个第三方应用程序.并且用户的外键始终指向auth.models.User.

例:

class Article(models.Model):
    user = models.ForeignKey('auth.User') # instead of your CustomUser
    text = ....
Run Code Online (Sandbox Code Playgroud)

和您的自定义用户模型:

class CustomUser(User):
    timezone = models.CharField(max_length=50, default='Europe/London')

    # Use UserManager to get the create_user method, etc.
    objects = UserManager()
Run Code Online (Sandbox Code Playgroud)

如果您通过Article实例访问用户字段会发生什么?这将引发异常:

u = a_article.user
u.timezone

AttributeError: 'User' object has no attribute 'timezone'
Run Code Online (Sandbox Code Playgroud)

也许这对你来说不是问题,你不想避免额外的数据库查询.但我会使用get_profile方式.

更新于2013年5月

从Django 1.5开始,您可以扩展默认的User模型,或者使用完全自定义的模型替换.

更新2016年11月

以上解决方案已过时,请参阅wim的评论

  • 这些天,任何第三方应用程序*应该*具有`settings.AUTH_USER_MODEL`作为关系,如果他们有硬编码''auth.User'`那么这就是第三方的错误. (2认同)