You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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后必须重启服务器,否则配置不会生效。

修复步骤总结

  1. 核对模型代码,确保继承关系、字段、管理器都正确。
  2. 确认settings.py中的AUTH_USER_MODEL和INSTALLED_APPS配置无误。
  3. 清理旧迁移和数据库文件(如果之前有默认用户模型的迁移记录)。
  4. 重新生成并应用迁移。
  5. 再次执行python manage.py createsuperuser,此时会提示输入手机号作为用户名。

内容的提问来源于stack exchange,提问作者famdude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:15:38