Django:扩展用户模型 VS 创建用户配置文件模型

8

我正在使用Django创建一个应用程序,到目前为止,我一直在使用扩展的用户模型,如下所示:

class MyUser(AbstractBaseUser):
...

我看到很多人在Stack Overflow上使用OneToOneField为个人资料和用户本身创建不同的模型,但这些大多数是旧问题。我的问题是:哪种方法更好,如果它们没有最佳解决方案,每种解决方案有什么优点?谢谢!

3个回答

12
这要看你想做什么,如果你对Django最新版本中的User模型满意,那就直接使用它,这很容易,而且你会得到很多相关功能,例如相当不错的权限系统,还可以确保与所有第三方模块兼容。但是,如果你认为需要扩展User模型,这也很简单。你可能会发现,将来需要向模型添加更多方法。
你所看到的分离UserProfile/User模型的示例大多是django < 1.5的遗留问题,当时这是扩展User模型的推荐方式。现在没有必要再遵循这种模式了,因为使用一个模型比使用两个模型要更加轻松。
如果您要开始一个新的Django项目,应该始终创建自己的自定义用户模型,该模型继承自AbstractUser,根据Django文档的要求。
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass 

即使您不需要任何额外的功能,也建议这样做。原因是,通过极低的努力,您可以轻松地在未来自定义用户对象。如果在运行初始迁移后要用自己的对象替换内置的User对象,则非常费时,除非您能够删除所有数据和迁移并重新开始。

7

我在Django文档中找到了一些有用的信息:

扩展Django默认用户模型¶

如果您完全满意Django的用户模型,并且只想添加一些附加配置文件信息,则可以简单地子类化django.contrib.auth.models.AbstractUser并添加自定义配置文件字段,尽管我们建议使用单独的模型,如“Model design considerations”中的说明所述的那样。AbstractUser提供了默认用户的完整实现作为抽象模型。

还有:

模型设计注意事项

在处理与身份验证无直接关联的信息之前,请仔细考虑您的自定义用户模型。

最好将特定于应用程序的用户信息存储在与用户模型有关系的模型中。这允许每个应用程序指定其自己的用户数据要求,而不会冒与其他应用程序冲突的风险。另一方面,检索此相关信息的查询将涉及数据库连接,这可能会影响性能。

因此,如果字段与身份验证相关,则应考虑替换原始用户模型。但是,如果它与身份验证无关,例如出生日期或个人资料图片等个人资料字段,则可能需要创建一个独立的应用程序,引用原始用户模型。

我找到了一篇很好的教程:http://riceball.com/d/content/django-18-tutoria-52-adding-user-profile


0

ForeignKey用于创建一对多的关系。换句话说,它将返回一个查询集。例如,一辆汽车有很多轮子,但是一个轮子不会连接到几辆不同的汽车上。

OneToOneField将创建严格两个对象之间的关系。例如,轮辋属于前左轮胎,只有那个轮胎才有那个轮辋。

这样讲清楚了吗?


嘿,是的,我有点困惑,因为我刚才使用了ForeignKey,现在我已经从问题中删除它:p。我的意思是问是否最好使用OneToOneField创建单独的用户配置文件来将配置文件与用户相关联,还是最好通过使用class MyUser(AbstractBaseUser):扩展用户模型并将所有内容放入一个用户模型中。 - dietbacon
1
这是个人偏好,但通常的做法是使用OneToOneField扩展用户配置文件。您将使用原始类MyUser(AbstractBaseUser)来获取必要的信息(例如用户名、名字、姓氏、是否活跃等——如果适用的话)。然而,如果您想要一个个人资料图片、描述等等,更容易创建一个类UserProfile(models.Model)来存储此类信息。这回答了您的问题吗? - jph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接