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

时间:2015-04-11 01:50:44

标签: python django django-models

我在Django中创建了一个应用程序,到目前为止我一直在使用扩展用户模型:

class MyUser(AbstractBaseUser):
...

包含所有用户和个人资料信息,但我看到很多人使用OneToOneField为配置文件创建不同的模型,而用户本身在堆栈溢出上创建,尽管这些主要是旧问题。 我的问题是:哪个更好,如果不是最好的,每个解决方案的优势是什么? 谢谢!

3 个答案:

答案 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将在严格的两个对象之间创建关系。例如,轮辋属于左前轮胎,只有轮胎具有轮辋。

这有意义吗?