在 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 中使用自定义字段扩展用户模型

在 django 中获取继承的模型对象

django-oauth2-provider与自定义用户模型?

在 django 中扩展用户模型 - 检索数据

在 Django 中使用更多字段扩展用户模型的最佳方法是啥?

将 Django auth UserAdmin 用于自定义用户模型