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

xtupzzrd  于 2023-01-10  发布在  Go
关注(0)|答案(3)|浏览(145)

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

class MyUser(AbstractBaseUser):
...

所有的用户和配置文件信息,但是我看到很多人使用OneToOneField为配置文件和堆栈溢出的用户本身创建不同的模型,尽管这些大多是老问题。哪个更好,如果没有最好的,每个解决方案的优点是什么?谢谢!

igetnqfo

igetnqfo1#

这取决于你想做什么--如果你对Django最新版本中的User模型满意,你可以直接使用它--它很简单,你会得到很多功能a a比如一个很好的权限系统,你可以确保与所有第三方模块兼容。但是如果你认为你需要扩展User模型,方法非常简单,你可能会发现将来你需要向你的模型中添加比你预期的更多的方法。
您所看到的使用单独的UserProfile / User模型的示例大多是django〈1.5的遗留问题,这是推荐的扩展User模型的方法,没有理由再遵循这种模式--在只需要一个模型的情况下使用两个模型会带来更多的工作

2019年更新

如果您正在启动一个新的Django项目,您应该始终创建自己的自定义用户模型,该模型继承自AbstractUser,如Django文档所述,即

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

即使您不需要任何附加功能。这样做的原因是,您只需很少的工作量,就可以在将来轻松地自定义用户对象。在运行初始迁移后,用您自己的对象替换内置的User对象是非常费力的,除非您能够删除所有数据和迁移并重新开始。

6yt4nkrj

6yt4nkrj2#

我在Django文档中找到了一些有用的信息:
扩展Django的默认用户¶
如果你对Django的用户模型非常满意,并且只想添加一些额外的配置文件信息,你可以简单地将django.contrib.auth.models.AbstractUser子类化并添加自定义的配置文件字段,尽管我们建议使用一个单独的模型,如指定自定义用户模型的"模型设计注意事项"注解中所述。
以及:
模型设计考虑
在处理与自定义用户模型中的身份验证不直接相关的信息之前,请仔细考虑。
最好将应用程序特定的用户信息存储在与用户模型有关系的模型中。这样,每个应用程序都可以指定自己的用户数据要求,而不会冒与其他应用程序冲突的风险。另一方面,检索此相关信息的查询将涉及数据库联接,这可能会影响性能。
如果我没理解错的话,这意味着如果字段与身份验证相关,那么您应该考虑替换原始用户模型。但如果字段与身份验证不相关,比如birthday或profile_image,那么您可能需要创建一个引用原始用户模型的独立应用。
和一个很好的教程,我发现:http://riceball.com/d/content/django-18-tutoria-52-adding-user-profile

jxct1oxe

jxct1oxe3#

外键用于创建一对多关系,也就是说,它将返回一个查询集,例如,一辆汽车有多个车轮,但一个车轮没有连接到多辆不同的汽车。
OneToOneField将严格地在两个对象之间创建关系。例如,轮辋属于左前轮胎,并且只有该轮胎具有该轮辋。
这有道理吗?

相关问题