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

Django自定义User模型后createsuperuser出现非空约束报错求助

报错原因

核心错误是django.db.utils.IntegrityError: NOT NULL constraint failed: employes_user.cin,触发逻辑是:
你自定义的User模型中新增了cin整数字段,没有设置允许为空也没有默认值,而Django的createsuperuser命令默认只会收集USERNAME_FIELD指定字段、REQUIRED_FIELDS列表中的字段、密码这三类信息,你当前的REQUIRED_FIELDS为空,所以创建超级用户时没有收集cin的值,插入数据库时触发非空约束报错。

另外你代码还存在两个隐性问题:

  1. 重复定义了AbstractUser已经自带的字段:first_name、last_name、username、password、email、is_superuser、is_staff,继承后这些字段会自动生成,重复定义会引发逻辑冲突,比如你自定义的password字段max_length仅为30,存不下Django生成的哈希密码,后续会直接导致登录失败。
  2. 所有max_length参数传了字符串"30",Django要求该参数必须是整数,写法错误。
修复步骤
  • 第一步:清理User模型冗余字段,修正参数写法
    删除所有AbstractUser自带的重复字段,把max_length的引号去掉,修改后基础代码如下:

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    
    class User(AbstractUser):
        cin     = models.IntegerField()
        codeQR  = models.CharField(max_length=30)
        poste   = models.CharField(max_length=30)
        image   = models.CharField(max_length=30)
        telephone= models.IntegerField()
    
        USERNAME_FIELD = 'username'
    
  • 第二步:适配createsuperuser命令的字段要求,二选一即可:

    • 方案1:要求创建超级用户时必须填写cin、telephone等自定义字段,把字段名添加到REQUIRED_FIELDS列表中,createsuperuser会自动询问这些字段的值:
      REQUIRED_FIELDS = ['email', 'cin', 'telephone']
      
    • 方案2:超级用户不需要填写这些自定义字段,给字段添加允许为空的参数或者默认值:
      # 示例,允许字段为空
      cin     = models.IntegerField(null=True, blank=True)
      telephone= models.IntegerField(null=True, blank=True)
      # 不需要在REQUIRED_FIELDS中加这两个字段
      REQUIRED_FIELDS = ['email']
      
  • 第三步:重新生成迁移并应用
    如果是开发环境没有重要数据,建议先删除项目根目录的db.sqlite3文件,以及你的app下migrations文件夹中除了__init__.py之外的所有文件,再依次执行命令:

    py manage.py makemigrations
    py manage.py migrate
    

    执行完成后再运行py manage.py createsuperuser就可以正常创建超级用户了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 06:51:03