Django:如何重用自定义用户模型 - 继承或扩展?

时间:2016-01-19 09:49:14

标签: python django inheritance django-models

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

1 个答案:

答案 0 :(得分:0)

我认为达到你要求的最好方法是:

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,如下所示:{。1}}在settings.py中用于主Django项目。在我的示例AUTH_USER_MODEL = 'courseSystem.MyUser'中定义了自定义用户类。

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

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

Learners

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

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