我正在Django中创建一个应用,到目前为止,我一直在使用一个扩展的用户模型,如下所示:
class MyUser(AbstractBaseUser): ...
所有的用户和配置文件信息,但是我看到很多人使用OneToOneField为配置文件和堆栈溢出的用户本身创建不同的模型,尽管这些大多是老问题。哪个更好,如果没有最好的,每个解决方案的优点是什么?谢谢!
OneToOneField
igetnqfo1#
这取决于你想做什么--如果你对Django最新版本中的User模型满意,你可以直接使用它--它很简单,你会得到很多功能a a比如一个很好的权限系统,你可以确保与所有第三方模块兼容。但是如果你认为你需要扩展User模型,方法非常简单,你可能会发现将来你需要向你的模型中添加比你预期的更多的方法。您所看到的使用单独的UserProfile / User模型的示例大多是django〈1.5的遗留问题,这是推荐的扩展User模型的方法,没有理由再遵循这种模式--在只需要一个模型的情况下使用两个模型会带来更多的工作
2019年更新
如果您正在启动一个新的Django项目,您应该始终创建自己的自定义用户模型,该模型继承自AbstractUser,如Django文档所述,即
AbstractUser
from django.contrib.auth.models import AbstractUser class User(AbstractUser): pass
即使您不需要任何附加功能。这样做的原因是,您只需很少的工作量,就可以在将来轻松地自定义用户对象。在运行初始迁移后,用您自己的对象替换内置的User对象是非常费力的,除非您能够删除所有数据和迁移并重新开始。
User
6yt4nkrj2#
我在Django文档中找到了一些有用的信息:扩展Django的默认用户¶如果你对Django的用户模型非常满意,并且只想添加一些额外的配置文件信息,你可以简单地将django.contrib.auth.models.AbstractUser子类化并添加自定义的配置文件字段,尽管我们建议使用一个单独的模型,如指定自定义用户模型的"模型设计注意事项"注解中所述。以及:模型设计考虑在处理与自定义用户模型中的身份验证不直接相关的信息之前,请仔细考虑。最好将应用程序特定的用户信息存储在与用户模型有关系的模型中。这样,每个应用程序都可以指定自己的用户数据要求,而不会冒与其他应用程序冲突的风险。另一方面,检索此相关信息的查询将涉及数据库联接,这可能会影响性能。如果我没理解错的话,这意味着如果字段与身份验证相关,那么您应该考虑替换原始用户模型。但如果字段与身份验证不相关,比如birthday或profile_image,那么您可能需要创建一个引用原始用户模型的独立应用。和一个很好的教程,我发现:http://riceball.com/d/content/django-18-tutoria-52-adding-user-profile
jxct1oxe3#
外键用于创建一对多关系,也就是说,它将返回一个查询集,例如,一辆汽车有多个车轮,但一个车轮没有连接到多辆不同的汽车。OneToOneField将严格地在两个对象之间创建关系。例如,轮辋属于左前轮胎,并且只有该轮胎具有该轮辋。这有道理吗?
3条答案
按热度按时间igetnqfo1#
这取决于你想做什么--如果你对Django最新版本中的User模型满意,你可以直接使用它--它很简单,你会得到很多功能a a比如一个很好的权限系统,你可以确保与所有第三方模块兼容。但是如果你认为你需要扩展User模型,方法非常简单,你可能会发现将来你需要向你的模型中添加比你预期的更多的方法。
您所看到的使用单独的UserProfile / User模型的示例大多是django〈1.5的遗留问题,这是推荐的扩展User模型的方法,没有理由再遵循这种模式--在只需要一个模型的情况下使用两个模型会带来更多的工作
2019年更新
如果您正在启动一个新的Django项目,您应该始终创建自己的自定义用户模型,该模型继承自
AbstractUser
,如Django文档所述,即即使您不需要任何附加功能。这样做的原因是,您只需很少的工作量,就可以在将来轻松地自定义用户对象。在运行初始迁移后,用您自己的对象替换内置的
User
对象是非常费力的,除非您能够删除所有数据和迁移并重新开始。6yt4nkrj2#
我在Django文档中找到了一些有用的信息:
扩展Django的默认用户¶
如果你对Django的用户模型非常满意,并且只想添加一些额外的配置文件信息,你可以简单地将django.contrib.auth.models.AbstractUser子类化并添加自定义的配置文件字段,尽管我们建议使用一个单独的模型,如指定自定义用户模型的"模型设计注意事项"注解中所述。
以及:
模型设计考虑
在处理与自定义用户模型中的身份验证不直接相关的信息之前,请仔细考虑。
最好将应用程序特定的用户信息存储在与用户模型有关系的模型中。这样,每个应用程序都可以指定自己的用户数据要求,而不会冒与其他应用程序冲突的风险。另一方面,检索此相关信息的查询将涉及数据库联接,这可能会影响性能。
如果我没理解错的话,这意味着如果字段与身份验证相关,那么您应该考虑替换原始用户模型。但如果字段与身份验证不相关,比如birthday或profile_image,那么您可能需要创建一个引用原始用户模型的独立应用。
和一个很好的教程,我发现:http://riceball.com/d/content/django-18-tutoria-52-adding-user-profile
jxct1oxe3#
外键用于创建一对多关系,也就是说,它将返回一个查询集,例如,一辆汽车有多个车轮,但一个车轮没有连接到多辆不同的汽车。
OneToOneField将严格地在两个对象之间创建关系。例如,轮辋属于左前轮胎,并且只有该轮胎具有该轮辋。
这有道理吗?