16

要使用自定义字段扩展 User 对象,Django 文档建议使用UserProfiles。但是,根据这个对大约一年前关于这个问题的回答:

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

诸如此类的文章阐述了如何使用自定义字段扩展用户模型,以及优点(直接从用户对象中检索属性,而不是通过 .get_profile())。

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

4

2 回答 2

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()

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

u = a_article.user
u.timezone

AttributeError: 'User' object has no attribute 'timezone'

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

2013 年 5 月更新

从 Django 1.5 开始,您可以扩展默认的用户模型,或者用完全定制的模型替代。

2016 年 11 月更新

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

于 2010-05-03T13:47:06.337 回答
2

以下是James Bennett在这篇关于模型继承的博客文章中所说的:

我敢打赌,通过定义相关模型并将其与唯一的外键链接回来,人们说他们想要对子类做的事情中可能有 90% 或更多的事情可以更好地完成。

所以我认为最好的方法仍然是使用外部应用程序,例如Pinax的某些组件,或django-profiles应用程序(最初来自同一个 James Bennett)。

于 2010-05-03T14:08:06.177 回答