Django自定义User模型以手机号为用户名创建超级用户报错
自定义手机号用户模型创建超级用户报错的解决办法
核心问题排查方向
1. 模型定义是否规范
- 必须继承正确的父类:自定义用户模型要继承
AbstractBaseUser+PermissionsMixin(或AbstractUser),如果直接继承models.Model,Django不会将其识别为用户模型,USERNAME_FIELD配置自然无效。 - 确认
phone_number字段存在且拼写一致:检查模型里是否有phone_number字段,且USERNAME_FIELD = 'phone_number'的字段名完全匹配(大小写敏感)。 - 必须自定义UserManager:继承
AbstractBaseUser时,必须实现自定义管理器,包含create_user和create_superuser方法,否则创建超级用户时会出现字段找不到的异常。
正确的模型示例:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin from django.db import models class UserManager(BaseUserManager): def create_user(self, phone_number, password=None, **extra_fields): if not phone_number: raise ValueError('手机号不能为空') user = self.model(phone_number=phone_number, **extra_fields) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, phone_number, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) return self.create_user(phone_number, password, **extra_fields) class User(AbstractBaseUser, PermissionsMixin): phone_number = models.CharField(max_length=11, unique=True, verbose_name='手机号') is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) objects = UserManager() USERNAME_FIELD = 'phone_number' REQUIRED_FIELDS = []
2. 迁移流程是否正确
- 未执行迁移或迁移不完整:修改模型后必须执行以下命令同步数据库:
python manage.py makemigrations accounts python manage.py migrate - 项目初始化后才配置
AUTH_USER_MODEL:Django要求这个配置必须在第一次运行迁移前设置。如果之前已经执行过默认auth应用的迁移,必须清理旧数据:- 删除
accounts/migrations/下除__init__.py外的所有迁移文件 - 删除项目根目录的
db.sqlite3数据库文件 - 删除
auth、admin等内置应用的迁移文件(如果已生成) - 重新执行迁移命令
- 删除
3. 配置是否生效
- 检查
settings.py:确保accounts已加入INSTALLED_APPS,且AUTH_USER_MODEL = 'accounts.User'配置正确。 - 重启开发服务器:修改
settings.py后必须重启服务器,否则配置不会生效。
修复步骤总结
- 核对模型代码,确保继承关系、字段、管理器都正确。
- 确认
settings.py中的AUTH_USER_MODEL和INSTALLED_APPS配置无误。 - 清理旧迁移和数据库文件(如果之前有默认用户模型的迁移记录)。
- 重新生成并应用迁移。
- 再次执行
python manage.py createsuperuser,此时会提示输入手机号作为用户名。
内容的提问来源于stack exchange,提问作者famdude
相关产品推荐
相关产品推荐

