我正在使用Django创建一个应用程序,到目前为止,我一直在使用扩展的用户模型,如下所示:
class MyUser(AbstractBaseUser):
...
我看到很多人在Stack Overflow上使用OneToOneField
为个人资料和用户本身创建不同的模型,但这些大多数是旧问题。我的问题是:哪种方法更好,如果它们没有最佳解决方案,每种解决方案有什么优点?谢谢!
我正在使用Django创建一个应用程序,到目前为止,我一直在使用扩展的用户模型,如下所示:
class MyUser(AbstractBaseUser):
...
我看到很多人在Stack Overflow上使用OneToOneField
为个人资料和用户本身创建不同的模型,但这些大多数是旧问题。我的问题是:哪种方法更好,如果它们没有最佳解决方案,每种解决方案有什么优点?谢谢!
AbstractUser
,根据Django文档的要求。from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
User
对象,则非常费时,除非您能够删除所有数据和迁移并重新开始。我在Django文档中找到了一些有用的信息:
扩展Django默认用户模型¶
如果您完全满意Django的用户模型,并且只想添加一些附加配置文件信息,则可以简单地子类化django.contrib.auth.models.AbstractUser并添加自定义配置文件字段,尽管我们建议使用单独的模型,如“Model design considerations”中的说明所述的那样。AbstractUser提供了默认用户的完整实现作为抽象模型。
还有:
模型设计注意事项
在处理与身份验证无直接关联的信息之前,请仔细考虑您的自定义用户模型。
最好将特定于应用程序的用户信息存储在与用户模型有关系的模型中。这允许每个应用程序指定其自己的用户数据要求,而不会冒与其他应用程序冲突的风险。另一方面,检索此相关信息的查询将涉及数据库连接,这可能会影响性能。
因此,如果字段与身份验证相关,则应考虑替换原始用户模型。但是,如果它与身份验证无关,例如出生日期或个人资料图片等个人资料字段,则可能需要创建一个独立的应用程序,引用原始用户模型。
我找到了一篇很好的教程:http://riceball.com/d/content/django-18-tutoria-52-adding-user-profile
ForeignKey用于创建一对多的关系。换句话说,它将返回一个查询集。例如,一辆汽车有很多轮子,但是一个轮子不会连接到几辆不同的汽车上。
OneToOneField将创建严格两个对象之间的关系。例如,轮辋属于前左轮胎,只有那个轮胎才有那个轮辋。
这样讲清楚了吗?
OneToOneField
创建单独的用户配置文件来将配置文件与用户相关联,还是最好通过使用class MyUser(AbstractBaseUser):
扩展用户模型并将所有内容放入一个用户模型中。 - dietbacon