Django多对一ForeignKey出现UNIQUE约束IntegrityError报错求解
问题原因
你遇到的UNIQUE constraint failed: LocalManager_intensivecare_forms.unites_id_id报错,本质是数据库层面intensivecare_forms表的unites_id_id字段被加了唯一约束,才会导致同一个unites只能关联一条intensivecare_forms记录,表现出一对一的效果。
Django普通ForeignKey默认不会添加唯一约束,出现这个问题的常见诱因有两个:
- 最初定义该外键字段时,误写为
OneToOneField,或是额外加了unique=True参数,首次迁移时就把唯一约束写入了数据库;后续你把字段改回普通ForeignKey后,没有生成新的迁移文件或是迁移未正确执行,数据库里的旧约束还未被清除。 - 手动修改过数据库表结构,误给该字段添加了唯一约束。
解决方案
测试数据可删除的情况(推荐新手操作)
- 删除对应app下
migrations文件夹中除了__init__.py之外的所有迁移文件,同时删除项目根目录下的sqlite数据库文件(默认名为db.sqlite3) - 重新生成迁移文件:
python manage.py makemigrations
- 执行迁移重建表结构:
python manage.py migrate
需保留现有数据的情况
用sqlite可视化管理工具打开你的数据库文件,找到LocalManager_intensivecare_forms表,删除unites_id_id字段上的唯一约束即可。
优化建议
Django有通用的代码命名规范,你可以参考调整避免后续混淆:
- 模型类名使用大驼峰格式,比如
Unites、IntensivecareForms - 外键字段不要带
_id后缀,Django会自动给数据库存储的字段加_id后缀,你当前命名为unites_id,数据库实际字段就变成了unites_id_id,非常容易混淆,建议修改为:
unite = models.ForeignKey(unites, on_delete=models.CASCADE)
内容的提问来源于stack exchange,提问作者nogabemist
相关产品推荐
相关产品推荐

