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

Django创建自定义用户时触发is_admin非空约束错误求助

问题诊断与修复方案

核心原因

你碰到的这个问题本质是数据库表和Django ORM模型不同步导致的:

  • 虽然你现在的UserProfile模型里已经删掉了is_admin字段,但数据库的userprofile表中还保留着这个字段,并且设置了NOT NULL约束;
  • 当Django ORM保存用户对象时,不会自动填充模型中不存在的字段值,导致数据库收到NULL值,触发非空约束错误;
  • 而你尝试给create_user传is_admin=False报错,是因为当前模型确实没有定义这个字段,Django的ORM不允许传入模型不存在的参数。

修复方案

方案1:同步数据库与模型(推荐)

这是最彻底的解决方式,通过Django的迁移系统移除数据库中多余的is_admin字段:

  1. 生成新的迁移文件,让Django检测到模型中移除了is_admin字段:
    python manage.py makemigrations
    
  2. 执行迁移,将数据库表更新为和模型一致:
    python manage.py migrate
    

注意:如果是生产环境,执行前一定要备份数据库,避免数据丢失。

方案2:临时兼容(仅用于无法立即迁移的场景)

如果暂时不能执行数据库迁移,可以先在模型中临时添加is_admin字段并设置默认值,让ORM能正确填充该字段的值,之后再逐步移除:

# models.py
class UserProfile(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True)
    username = models.CharField(max_length=255, unique=True)
    # ... 其他现有字段
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_editor = models.BooleanField(default=False)
    # 临时添加is_admin字段,设置默认值
    is_admin = models.BooleanField(default=False)
    objects = UserProfileManager()
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

添加后执行makemigrations和migrate,确保数据库和模型同步。之后你可以再删除这个临时字段,重新执行迁移完成清理。

额外检查

  • 确认你没有在其他地方(比如第三方认证库、自定义中间件)动态给用户模型添加is_admin字段;
  • 检查项目的迁移文件历史,是否之前有过添加is_admin字段的迁移,后来没有正确回滚或删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:11:37