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

时间:2010-05-03 12:56:10

标签: django django-users

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

  

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

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

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

2 个答案:

答案 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 Bennettblog entry about model inheritance所说的内容:

  

我敢打赌,通过定义一个相关的模型并将其与一个唯一的外键链接起来,可能会有90%或更多人说他们想要用子类做的事情。

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