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字段:
- 生成新的迁移文件,让Django检测到模型中移除了
is_admin字段:python manage.py makemigrations - 执行迁移,将数据库表更新为和模型一致:
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
相关产品推荐
相关产品推荐

