如何扩展Django auth用户管理器添加自定义方法并保留原有内置方法
Django自定义Auth用户模型保留内置方法的实现方案
错误根因
你自定义的用户管理器继承了基础的models.Manager类,没有继承Django Auth模块自带的UserManager,因此丢失了create_user、create_superuser等所有内置用户操作方法。同时你的代码还存在额外问题:
- 缺失
uuid模块导入 - 自定义管理器类名拼写错误
- 自定义查询方法内硬编码了模型类,不符合管理器编写规范
- 未在
settings.py中声明AUTH_USER_MODEL指定自定义用户模型,属于Django扩展用户模型的必填遗漏配置
正确实现步骤
- 自定义用户管理器继承
django.contrib.auth.models.UserManager - 修复代码中的拼写、导入、查询逻辑问题
- 追加
AUTH_USER_MODEL配置 - 重新生成数据库迁移并执行
完整代码
models/custom_user.py
import uuid from django.contrib.auth.models import AbstractUser, UserManager from django.db import models class CustomUserManager(UserManager): def get_active_users(self): # 内部查询使用self指代当前管理器绑定的模型,避免硬编码 return list(self.filter(is_active=True)) class CustomUser(AbstractUser): uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) objects = CustomUserManager()
settings.py追加配置
# 声明项目使用的默认用户模型,格式为 应用名.自定义用户类名 AUTH_USER_MODEL = 'cbapp.CustomUser'
迁移执行命令
# 若之前已生成过auth相关迁移,需先删除旧迁移文件、清空数据库后再执行以下命令 python manage.py makemigrations python manage.py migrate
功能验证
修改完成后,内置方法和自定义方法可同时正常调用:
# 内置创建用户方法正常可用 user = CustomUser.objects.create_user('Dave', 'myemail@test.com', 'johnpassword') # 自定义查询方法正常可用 active_users = CustomUser.objects.get_active_users()
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

