# AbstractUser
如果要创建一个用户,需要设置各种字段、组、权限、cookie管理、密码处理等,比较麻烦,所以 Django
已经为我们创建了一个抽象用户,我们只需要继承它,然后添加自己的字段即可。AbstractUser
是一个提供了对 User
全面的实现的抽象模型。
# 基本属性和常用方法
属性或方法 | 说明 |
---|---|
username | 用户名(必要) |
password | 密码(必要) |
邮件 | |
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
AbstractBaseUser
与 AbstractUser
看起来颇为相似。
# 导入方法
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
会帮我们添加 id
、last_login
、is_staff
等等字段。如果我们只需要基本的用户名、密码等等几个简单的字段的时候, AbstractUser
就比较臃肿了,这时候就可以选择继承AbstractBaseUser
类来自定义一些字段,这时候迁移数据库 django
会帮我们添加 id
、password
、last_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_staff
和 is_superuser
为 True
。