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 字段
email 字段 邮箱
is_staff 字段 可否登录后台
is_active 字段 可否登录
date_joined 字段 注册时间
objects 属性 User Manager 实例
EMAIL_FIELD 属性
USERNAME_FIELD 属性
REQUIRED_FIELDS 属性

通过继承 AbstractUser 实现

此部分会于将来完善

通过继承 AbstractBaseUser 实现

如果利用 AbstractBaseUser,则需要自行编写 UserManager 对象并实现相应的权限控制。因此如非必要则尽量避免使用。