Django创建超级用户触发IntegrityError:id字段非空约束违规
问题原因与解决方案
核心问题
你遇到的IntegrityError是因为手动覆盖了AbstractUser的主键字段,但未配置自增逻辑,导致创建超级用户时id字段为null,违反非空约束。此外你的模型还存在两处冗余/冲突定义:
- AbstractUser默认自带自增
AutoField类型的主键id,你手动定义为普通IntegerField(primary_key=True)后,Django不会自动生成自增值,插入数据时就会出现null。 - AbstractUser已内置
password字段,Django会自动处理密码哈希存储,你定义的hashed_password完全多余,还可能与内置逻辑冲突。
修复步骤
- 移除冗余字段:删掉模型中的
id和hashed_password字段,保留AbstractUser默认的主键与密码处理逻辑:class JobseekerRegisterInfo(AbstractUser): phone_number = PhoneNumberField() email = models.EmailField(unique=True) full_name = models.CharField(max_length=120) def __str__(self): return self.full_name - 若需自定义主键:如果确实要指定主键类型,使用
AutoField或BigAutoField确保自增特性:class JobseekerRegisterInfo(AbstractUser): id = models.BigAutoField(primary_key=True) # BigAutoField适配更大数值范围 phone_number = PhoneNumberField() email = models.EmailField(unique=True) full_name = models.CharField(max_length=120) def __str__(self): return self.full_name - 确认全局配置:在
settings.py中必须指定自定义用户模型:AUTH_USER_MODEL = '你的应用名.JobseekerRegisterInfo' - 重置数据库迁移:如果之前生成过迁移文件,删除应用下
migrations目录中除__init__.py外的所有文件,清空数据库后重新执行:python manage.py makemigrations python manage.py migrate - 重新创建超级用户:完成上述步骤后,执行
python manage.py createsuperuser即可正常创建。
内容的提问来源于stack exchange,提问作者Dimaapp
相关产品推荐
相关产品推荐

