Django 1.5 + 用户模型关系

5
Django 1.5+允许我们向用户添加自定义字段。我想利用这个特性,但不确定什么是最佳实践。以下是一个我在如何处理模型方面感到困惑的情况。
如果项目中只有一种类型的用户,比如一个学生模型,那么是否可以简单地向用户添加特定于学生的字段?我是Django的新手,但我认为另一种选择是设置通用的用户设置,并创建一个学生模型和一个称为用户的一对一唯一字段。
即使项目保证只有一种类型的用户,你是否应该扩展Django用户的字段以模仿模型?
2个回答

13

如果你只有一种类型的用户并且使用Django 1.5+,我建议利用新的AbstractUser。 扩展Django的默认用户

例如,您想要添加出生日期和喜爱的颜色:

#myusers/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class MyUser(AbstractUser):
    dob = models.DateField()
    favorite_color = models.CharField(max_length=32, default='Blue')

如果您需要更多的灵活性,可以扩展AbstractBaseUser而不是AbstractUser,但对于大多数基本情况,您只需要AbstractUser即可。

还要注意,无论哪种情况,您都需要使用settings.AUTH_USER_MODEL来reference your user model

以上面的示例为例,假设它所在的应用程序名为myusers

#settings.py
AUTH_USER_MODEL = 'myusers.MyUser'

你提到的创建一个具有指向用户模型的一对一字段的学生模型的方法仍然可行,但不够简洁(如果您有多种类型的用户,则仍有情况可以使用这个方法)。

我通常不喜欢在回答中引用书籍,但我发现《Django二分之一的冰淇淋》第16章关于用户模型的解释比当前版本的在线Django文档更加清晰。 这本书总体上是Django入门的非常有用的介绍,并基于1.5编写。 您必须购买该书或找到拥有者...(FYI:我没有从此推荐中获得任何收益)。

您还可以查看这个SO问题/答案:https://dev59.com/VWzXa4cB1Zd3GeqPWKxl#14104748


它有什么不干净的地方? - Burhan Khalid
3
它会在数据库中创建一张额外的表。如果你经常引用像名字和姓氏这样的东西,再加上一些需要每次进行额外连接的自定义信息。 - Jacinda
Jacinda - 巧合的是,我今天早些时候已经购买了这本书!虽然我还没有到那里,但看到那个参考,他们给出了三个好的选择:从相关模型链接回来,子类化AbstractUser,或者子类化AbstractBaseClassUser。不幸的是,我正在使用一个第三方应用程序,我想要子类化它,你有什么想法吗? - Joker
django-userena。如果您认为回答超出了评论的范围,我可以提出一个新的SO问题。基本上,我只想从上面的链接中创建UserenaBaseProfile的子类。 - Joker
啊,我明白了。看起来该项目仍然依赖于AUTH_PROFILE_MODULE。我认为你可以按照上面的步骤创建一个自定义用户模型,并创建一个继承自UserenaBaseProfile的配置文件模型,它与您的用户模型具有一对一的关系(使用settings.AUTH_USER_MODEL),但不会在那里添加任何额外的字段。我认为你必须在1.5中这样做,因为AUTH_PROFILE_MODULE已被弃用。你可能想向userena开发人员发送一个问题,看看他们推荐什么,因为我想这可能会改变他们的一些代码。 - Jacinda
显示剩余2条评论

0

你不应该修改 Django 的认证框架中的 User 模型。这样会破坏升级,并且你不知道可能会有什么其他后果。

有两种基本方法可以实现此目的:

  1. 如果你只需要存储关于用户的其他信息,但不需要改变认证/授权机制的工作方式,请创建一个模型并将 OneToOneField 添加到 User 模型中。在此模型中,存储任何其他杂项信息。

  2. 如果你想要更改认证的工作方式,可以 创建自己的 User 模型 并让 Django 使用它(仅限 1.5+ 版本)。


5
如果你在1.5中开始一个新的应用程序,这并不正确。如果你只需要添加额外的字段,新的最佳实践是继承AbstractUser。 - Jacinda
不,只有在创建用户模型“替代品”时才需要继承AbstractUserModel;如果您只想添加一个字段,就不应该这样做。如果您正在实现如何为应用程序工作的身份验证/授权过程中的一些基本更改,则应创建自己的用户模型替代品。 - Burhan Khalid
3
我不是在谈论创建替代品的AbstractBaseUser,而是在谈论AbstractUser。根据文档:"如果您完全满意Django的用户模型,并且只想添加一些其他配置文件信息,则可以简单地继承django.contrib.auth.models.AbstractUser并添加自定义配置文件字段。该类提供了默认用户的完整实现作为抽象模型。"请注意,这里提到的是扩展现有用户模型而不是替换它。 - Jacinda
请访问以下链接以了解有关扩展Django默认用户的信息:https://docs.djangoproject.com/en/dev/topics/auth/customizing/#extending-django-s-default-user - Jacinda
有趣,如果我使用第三方应用程序。我应该如何使用一个提供了BaseUser类的第三方应用程序,该类旨在通过附加模型逻辑进行子类化。 - Joker
有趣。你能给一个需要这个的第三方应用程序的例子吗?在这种情况下,似乎你将使用他们的模型而不是Django内置的用户,因此你必须参考该应用程序的文档。 - Jacinda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接