【问题标题】:Django: How to reuse Custom user model - inherit or extend?Django:如何重用自定义用户模型 - 继承或扩展?
【发布时间】:2016-04-24 17:29:22
【问题描述】:

我的 django 项目中有不同的应用程序。我想为 auth&auth 保留一个独立的应用程序,该应用程序可以在所有应用程序中重复使用。 auth&auth 应用程序是我的基本自定义用户模型的一个应用程序。该用户需要使用电子邮件登录,因此我从 AbstractBaseUser 继承而不是扩展 User 类。现在在所有应用程序中登录方式相同,基本用户属性相同;但一些应用程序添加了额外的字段,如“薪水”,其他应用程序按原样使用该模型。那么重用我在登录应用程序中创建的自定义用户模型的最佳方法是什么?如果我继承具体类,我将有 2 个表。如果我声明自定义用户类抽象,我将如何使用它的功能、角色和权限?

【问题讨论】:

  • 这听起来更像是您需要修改身份验证登录步骤而不是您的用户模型。这是一个选项吗?
  • 感谢您回复 Sayse,但我不得不说不,但我不得不在任何地方定义用户模型,只是在少数地方为一两个额外的列。跨度>
  • 在某处定义您的用户模型并将其导入其他任何地方?

标签: python django inheritance django-models


【解决方案1】:

我认为实现您所要求的最佳方法是:

class Learners(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, unique=True)
    nick = models.CharField(max_length=12, unique=True)
    #Many to Many relationship with course
    courses = models.ManyToManyField(Course, blank=True)

    def __str__(self):
        return self.user.get_full_name()

AUTH_USER_MODEL 设置为自定义用户模型,继承自您创建的 AbstractBaseUser,如下所示:主 Django 项目的 settings.py 中的 AUTH_USER_MODEL = 'courseSystem.MyUser'。在我的示例中,courseSystem.MyUser 是定义的自定义用户类。

我正在与您在上面描述的类似情况中分享这一点,我正在努力。

在上面的示例中,如果您要将自定义 MyUser 类设为抽象类,然后从中继承 Learners 类:

class Learners(MyUser):

那么 Learners 类将不再是 models.Model 类型类,而是该应用程序的具体 User 类,并且在每种情况下,即对于从抽象 MyUser 类继承的每个此类类,您都必须重载必要的成员Django 的具体用户类所需的 MyUser。此外,由于您使用的是AbstractBaseUser 并且没有扩展默认的User 类,因此您必须为您的自定义用户类定义自定义用户表单和用户管理器。因此,如果您有一个具体的MyUser 类,如上例所示,您可以为MyUser 定义一次自定义用户管理器和用户表单,并在不同应用程序中与您的模型保持一对一的关系。但是,如果您将MyUser 类设为抽象类,则不会为MyUser 定义用户表单和用户管理器,而是分别为您通过继承此抽象自定义用户类形成具体用户类的每个应用程序定义。

https://docs.djangoproject.com/en/1.9/topics/auth/customizing/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-11
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2018-06-10
    • 2011-02-15
    • 2011-02-22
    相关资源
    最近更新 更多