我在Django中创建了一个应用程序,到目前为止我一直在使用扩展用户模型:
class MyUser(AbstractBaseUser):
...
包含所有用户和个人资料信息,但我看到很多人使用OneToOneField
为配置文件创建不同的模型,而用户本身在堆栈溢出上创建,尽管这些主要是旧问题。
我的问题是:哪个更好,如果不是最好的,每个解决方案的优势是什么?
谢谢!
答案 0 :(得分:6)
这取决于你想要做什么 - 如果你对用户模型感到满意,因为它在最新版本的Django中你应该只使用它 - 它很简单,你就是&#39 ;将获得许多功能 - 例如一个非常好的权限系统,您可以确保与所有第三方模块兼容。但是,如果您需要扩展用户模型,那么如何做到这一点非常简单。您可能会发现将来需要为模型添加比预期更多的方法。
您使用单独的UserProfile / User模型看到的示例主要是django< 1.5,这是扩展User模型的推荐方法。没有理由不再遵循这种模式了 - 必须使用两个模型才能完成更多工作
<小时/> 2019更新
如果您正在开始一个新的Django项目,您应该始终根据Django文档创建自己的继承自AbstractUser
的自定义用户模型,即
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
即使您不需要任何其他功能。这样做的原因是,只需很少的工作量,您就可以轻松地在将来自定义用户对象。在您运行初始迁移后,使用您自己的对象替换内置User
对象非常费力,除非您能够删除所有数据和迁移并重新开始。< / p>
答案 1 :(得分:5)
我在Django文档中找到了一些有用的信息:
扩展Django的默认用户¶
如果您对Django的用户模型完全满意并且您只是想要 添加一些额外的配置文件信息,您可以简单地子类 django.contrib.auth.models.AbstractUser并添加您的自定义配置文件 字段,虽然我们推荐一个单独的模型,如中所述 “模型设计注意事项”注意指定自定义用户模型。 AbstractUser提供默认User的完整实现 一个抽象的模型。
和
模型设计考虑因素
在处理与之无直接关系的信息之前,请仔细考虑 自定义用户模型中的身份验证。
将特定于应用的用户信息存储在模型中可能更好 与用户模型有关系。这允许每个应用程序 指定自己的用户数据要求,而不会有与之冲突的风险 其他应用。另一方面,查询检索此相关 信息将涉及数据库连接,这可能会产生影响 性能
因此,如果我正确读取它,则意味着如果字段与身份验证相关,那么您应该考虑替换原始用户模型。但如果它不相关,例如配置文件字段,例如生日或profile_image,那么您可能想要创建一个引用原始用户模型的独立应用程序。
我发现了一个很好的教程:http://riceball.com/d/content/django-18-tutoria-52-adding-user-profile
答案 2 :(得分:0)
ForeignKey是创建一对多关系。换句话说,它将返回一个查询集。例如,一辆车有许多车轮,但是一个车轮没有连接到几辆不同的车上。
OneToOneField将在严格的两个对象之间创建关系。例如,轮辋属于左前轮胎,只有轮胎具有轮辋。
这有意义吗?