Django 继承 AbstractUser 自定义用户模型类

2021/11/25 DjangoPython

# AbstractUser

如果要创建一个用户,需要设置各种字段、组、权限、cookie管理、密码处理等,比较麻烦,所以 Django 已经为我们创建了一个抽象用户,我们只需要继承它,然后添加自己的字段即可。AbstractUser 是一个提供了对 User 全面的实现的抽象模型。

# 基本属性和常用方法

属性或方法 说明
username 用户名(必要)
password 密码(必要)
email 邮件
first_name 名字
last_name 姓氏
is_staff 是否管理员
create() 创建一个普通用户
create_user() 创建一个普通用户,密码加密
create_superuser() 创建一个超级用户(email必要)
set_password(pwd) 设置密码

# 创建用户

创建用户要导入认证模型类里的 User,再用 User 对象去创建用户

from django.contrib.auth.models import User 
User.objects.create(username='laowang',password='123')

# AbstractBaseUser

AbstractBaseUserAbstractUser 看起来颇为相似。

# 导入方法

from django.contrib.auth.models import AbstractUser, AbstractBaseUser

# 区别

  • The documentation explains this fully. AbstractUser is a full User model, complete with fields, as an abstract class so that you can inherit from it and add your own profile fields and methods. AbstractBaseUser only contains the authentication functionality, but no actual fields: you have to supply them when you subclass. 文档充分解释了这一点。 AbstractUser 是一个完整的用户模型,包含字段,作为一个抽象类,以便您可以继承它并添加您自己的配置文件字段和方法。 AbstractBaseUser 仅包含身份验证功能,但不包含实际字段:当您继承子类时,您必须提供它们。
  • The AbstractUser is basically just the "User" class you're probably already used to. AbstractBaseUser makes fewer assumptions and you have to tell it what field represents the username, what fields are required, and how to manage those users. AbstractUser 基本上就是您可能已经习惯的“User”类。 AbstractBaseUser 的继承较少,您必须告诉它哪个字段代表用户名,需要哪些字段以及如何管理这些用户。
  • If you're just adding things to the existing user (i.e. profile data with extra fields), then use AbstractUser because it's simpler and easier. If you want to rethink some of Django's assumptions about authentication, then AbstractBaseUser gives you the power to do so. 如果您只是将属性添加到现有用户(即具有额外字段的配置文件数据),则使用 AbstractUser ,因为它更简单,更容易。 如果您想重新考虑一下 Django 关于认证的假设,那么 AbstractBaseUser 会为您提供这样的权限。

简单来说,我们习惯的继承的 AbstractUser 类是高度集成的,里面定义了一堆的字段,不需要人为去定义了,除了我们自定义的字段外,django 会帮我们添加 idlast_loginis_staff等等字段。如果我们只需要基本的用户名、密码等等几个简单的字段的时候, AbstractUser 就比较臃肿了,这时候就可以选择继承AbstractBaseUser 类来自定义一些字段,这时候迁移数据库 django 会帮我们添加 idpasswordlast_login 三个字段。

在模型类中我们必须定义一个用户名字段,并指定属性为unique,然后告诉 django 这个字段是用户名字段:

class User(AbstractBaseUser):
    username = models.CharField(max_length=32,unique=True)
    USERNAME_FIELD = 'username'

如果不声明 USERNAME_FIELD ,数据库迁移时会报错 AttributeError: type object 'UserInfo' has no attribute 'USERNAME_FIELD'

# 自定义用户模型类

显然 Django 自带的用户模型类 User 是不能满足我们的需求的,比如说我们还需要添加手机号、是否记住密码等其他自定义字段,所以我们可以自定义模型类,然后继承 Abstract

# 1.定义模型类

这里在 应用.models.py 文件中, 定义一个模型类 User,增加手机号字段。

from django.db import models
from django.contrib.auth.models import AbstractUser

# 继承AbstractUser
class User(AbstractUser):
    mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')
    
    class Meta:
        db_table = 'tb_users'
        verbose_name = '用户'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username

# 2.指定用户模型类

项目需要配置才能使用自定义的模型类,在项目配置文件 settings.py 中添加 应用.User

# 自定义用户类型2
AUTH_USER_MODEL = '应用.User'

注意:建议对于 AUTH_USER_MODEL 参数的设置一定要在第一次数据库迁移之前就设置好,否则后续使用可能出现未知错误

# 3.数据迁移

完成数据迁移即生成数据表(关于 Django 数据库的配置这里忽略)

python manage.py makemigrations
python manage.py migrate

# 4.创建用户

# 导入自定义的模型类(继承Abstract那个)
from apps.users.models import User
try:
    user = User.objects.create_user(username="laowang",password="123456",mobile="10086")
except Exception as e:
    pass

# 管理器方法

管理器方法即可以通过 User.objects 进行调用的方法。

# create_user

create_user(username, email=None, password=None, **extra_fields)

创建、保存并返回一个 User 对象。

# create_superuser

create_superuser(username, email, password, **extra_fields)

create_user() 相同,但是设置 is_staffis_superuserTrue

最近更新: 7 个月前