创建Django超级用户触发IntegrityError,可空字段仍报非空约束错误
解决Django创建超级用户时的NOT NULL约束错误
问题分析
你自定义的InvestorUser模型里,watchlist字段明明设置了null=True和blank=True,但创建超级用户时仍报约束错误,核心原因大概率是数据库表结构没跟上模型定义的更新——也就是数据库中的b3ack_investoruser表,watchlist字段实际还是被标记为NOT NULL,和模型配置不一致。
解决方案
1. 先确认数据库表结构
直接查询数据库里的字段属性,验证问题:
- 用PostgreSQL的话,执行SQL命令:
SELECT column_name, is_nullable FROM information_schema.columns WHERE table_name = 'b3ack_investoruser' AND column_name = 'watchlist'; - 用MySQL的话,执行:
DESCRIBE b3ack_investoruser;
如果结果里is_nullable显示NO,说明表结构确实没同步,继续下面的步骤。
2. 重置迁移并同步表结构
先备份数据库(避免数据丢失),再按以下步骤操作:
- 删除
b3ack应用下migrations目录中,除了__init__.py以外的所有迁移文件 - 进入数据库,删除
django_migrations表中所有app='b3ack'的记录 - 重新生成迁移文件:
python3 manage.py makemigrations b3ack - 应用迁移,同步表结构:
python3 manage.py migrate b3ack
3. 手动修改数据库表结构(若上述步骤无效)
如果重置迁移还是没解决问题,直接手动修改表字段的约束:
- PostgreSQL:
ALTER TABLE b3ack_investoruser ALTER COLUMN watchlist DROP NOT NULL; - MySQL:
ALTER TABLE b3ack_investoruser MODIFY COLUMN watchlist JSON NULL;
完成以上操作后,再尝试创建超级用户即可解决问题。
内容的提问来源于stack exchange,提问作者Pedro Rossi
相关产品推荐
相关产品推荐

