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的值,插入数据库时触发非空约束报错。
另外你代码还存在两个隐性问题:
- 重复定义了
AbstractUser已经自带的字段:first_name、last_name、username、password、email、is_superuser、is_staff,继承后这些字段会自动生成,重复定义会引发逻辑冲突,比如你自定义的password字段max_length仅为30,存不下Django生成的哈希密码,后续会直接导致登录失败。 - 所有
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']
- 方案1:要求创建超级用户时必须填写
第三步:重新生成迁移并应用
如果是开发环境没有重要数据,建议先删除项目根目录的db.sqlite3文件,以及你的app下migrations文件夹中除了__init__.py之外的所有文件,再依次执行命令:py manage.py makemigrations py manage.py migrate执行完成后再运行
py manage.py createsuperuser就可以正常创建超级用户了。
内容的提问来源于stack exchange,提问作者moez mefteh
相关产品推荐
相关产品推荐

