提问者:小点点

Django身份验证用户和自定义用户


到目前为止,我一直在Django中创建一个user类,而没有继承AbstractBaseUser或AbstractUser类。 例如,

class User(models.Model):
    realname          = models.CharField(max_length=50)
    username          = models.CharField(max_length=50, unique=True)
    birthday          = models.DateField()
    phone             = models.CharField(max_length=50, unique=True)
    password          = models.CharField(max_length=2000)
    ...

现在我正在考虑创建一个实际继承AbstractBaseUser类的用户模型。

我的问题是,继承AbstractBaseUser在哪些方面提高了效率和生产力(如果有的话)?

我猜想set_password()函数可能会减轻用bcrypt手动加密输入密码的负担; 但是,创建一个UserManager类还需要额外的工作,使用auth.get_user_model()函数参考我的自定义用户模型(django文档中说,建议使用这种方式返回当前活动的用户模型),而不是简单地将其引用为'User',等等。我们将非常感谢您的帮助!!


共1个答案

匿名用户

基于Django中用户模型的文档,使用AbstractUser创建您自己的用户模型的优点是:

  1. 它与组和权限模型集成在一起,这将帮助您在应用程序中构建身份验证系统和授权系统。
  2. UserManager非常强大,因为它还提供了util函数,例如“set_password”,“has_perm”和“is_authenticated”等。

基于上述内容,您只需继承AbstractUser就可以构建自己的用户模型,因此不需要重新设计轮子。 它提供了灵活性和功能。 你也可以通过覆盖自己的方法来定制你自己的用户模型中的很多东西。

在您的示例中,您只需使用以下代码并在设置中指定AUTH_USER_MODEL='myapp.user':

from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    realname = models.CharField(max_length=50)
    birthday = models.DateField()
    phone = models.CharField(max_length=50, unique=True)