Django 自定义用户模型
如果想要自定义用户模型,一般来说有三种方法:
- 修改 AUTH_USER_MODEL
- 通过 OneToOneField 实现
- 不修改 AUTH_USER_MODEL
- 通过继承 AbstractUser 实现
- 通过继承 AbstractBaseUser 实现
其中,第一种方式对于数据库影响最小,可以在项目开发中进行更改;而第二、三种方式会极大的影响数据库(因为修改了数据库模型),因此如需使用应在投入使用前来使用。
第一种方式常用于在 User 模型添加字段,第二种方式常用于在 User 模型添加字段、方法或重写一些行为,第三种方式相当于完全重写 User 模型
修改 AUTH_USER_MODEL
通过 OneToOneField 实现
这种的使用和普通的数据库添加 OneToOneField 相同,在相应的模型中添加好 OneToOneField 并设定好 related_name 即可。
此部分会于将来完善
不修改 AUTH_USER_MODEL
先看看 AbstractUser
AbstractUser 位于 django.contrib.auth.models
(Django 2.0.5 中为 288 行),其继承了 AbstractBaseUser 与 PermissionsMixin
再看看 AbstractBaseUser
AbstractBaseUser 位于 django.contrib.auth.base_user
(Django 2.0.5 中为 47 行),其继承的是 models.Model 类,因此可以认为是「基本类」。
它定义了三个字段:password 密码、last_login 上次登录时间、is_active 是否活跃(非数据库字段,恒为 True),同时提供了一些和密码、权限有关的方法,具体列举如下。
属性/方法名 | 类型 | 用途说明 |
---|---|---|
password | 数据库字段 | 用户密码(可空) |
last_login | 数据库字段 | 上次登录时间 |
is_active | True | 用户是否活跃 |
get_username | 方法 | 获取用户用户名 |
save | 重写父类方法 | 保存用户时进行的处理 |
is_anonymous | @property 属性 False | 是否匿名 |
is_authenticated | @property 属性 True | 是否已登录 |
set_password | 方法 | 设置用户密码 |
check_password | 方法 | 检查用户密码是否正确 |
set_unusable_password | 方法 | 设置用户密码为无法登录 |
has_usable_password | 方法 | 返回「用户密码是否可以登录」 |
get_session_auth_hash | 方法 | |
get_email_field_name | 方法 | 获取邮箱字段的字段名(字符串) |
USERNAME_FIELD | 子类必须存在的属性 | 用户唯一标识字段的字段名,对应的字段必须存在 unique=True |
REQUIRED_FIELDS | 子类必须存在的属性 (父类也存在但是恒定为 []) | 用于 createsuperuser 命令时提示输入 |
is_active | 子类必须存在的数据库字段 (父类也存在但是恒定为 True) | 用户是否活跃(可以正常登录) |
get_full_name | 子类(可能)必须存在的方法 | 用户「全名」 |
get_short_name | 子类(可能)必须存在的方法 | 用户「简短的全名」 |
回看 AbstractUser
AbstractUser 继承自 AbstractUser 类和 PermissionsMixin 类,后者为实现权限相关。
属性/方法名 | 类型 | 用途说明 |
---|---|---|
username | 字段 | 用户名 |
last_name | 字段 | 姓 |
first_name | 字段 | 名 |
字段 | 邮箱 | |
is_staff | 字段 | 可否登录后台 |
is_active | 字段 | 可否登录 |
date_joined | 字段 | 注册时间 |
objects | 属性 | User Manager 实例 |
EMAIL_FIELD | 属性 | |
USERNAME_FIELD | 属性 | |
REQUIRED_FIELDS | 属性 |
通过继承 AbstractUser 实现
此部分会于将来完善
通过继承 AbstractBaseUser 实现
如果利用 AbstractBaseUser,则需要自行编写 UserManager 对象并实现相应的权限控制。因此如非必要则尽量避免使用。