Django Admin添加Item时tag_id违反非空约束报错如何解决?
问题根因
该报错和你当前的多对多字段、slug字段配置无关,核心原因是历史迁移残留:你最早在Item模型中曾将tag字段定义为ForeignKey类型,生成迁移并应用到数据库后,才修改为现在的ManyToManyField类型。但你清理迁移时没有同步删除数据库item_item表中之前ForeignKey生成的tag_id非空字段,保存Item时该字段没有传入值,因此触发非空约束报错。
解决方案
按以下步骤操作即可解决:
- 提前备份数据库,避免数据丢失
- 删除
item应用migrations目录下除__init__.py之外的所有迁移文件 - 连接PostgreSQL数据库,执行以下SQL清理旧迁移记录:
DELETE FROM django_migrations WHERE app='item';
- 执行SQL删除残留的多余字段:
ALTER TABLE item_item DROP COLUMN tag_id;
- 回到项目目录重新生成迁移:
python manage.py makemigrations item - 执行新迁移:
python manage.py migrate item
可选优化建议
你当前的多对多字段related_name配置不符合规范,该参数定义的是从Tag反向查询Item时的属性名,建议修改为更语义化的名称,例如:
tag = models.ManyToManyField(Tag, related_name='items', blank=True)
后续通过Tag实例查询关联的Item时可以直接用tag.items.all(),可读性更高。
内容的提问来源于stack exchange,提问作者jeremy_lord
相关产品推荐
相关产品推荐

