Django外键报错“question_question”引用“question_subject”不匹配如何解决
Django外键不匹配报错解决方案
问题根因
该报错的核心原因是Question表中subject外键字段的类型,与关联的Subject表主键类型不匹配:
- 你自定义了
Subject模型的主键为name(字符串类型,长度255),如果修改主键定义前已经生成过迁移、创建过数据库表,Question表的subject外键字段仍会保留之前关联Subject默认整数id的类型,两类字段类型不一致就会触发外键校验失败。 - 也有可能是数据库中
Question表已存储的subject外键值,在Subject表的name字段中没有对应记录,触发外键约束。
开发环境解决方法(无重要生产数据时推荐)
- 清空对应App的历史迁移文件:保留App下
migrations文件夹中的__init__.py,删除其余所有迁移文件 - 删除开发环境的数据库文件(如sqlite的
db.sqlite3),或者手动清空该App相关的所有数据库表 - 重新生成迁移并执行:
python manage.py makemigrations python manage.py migrate
生产环境解决方法(不可清空数据时使用)
- 先手动查看数据库表结构:确认
question_question表的subject_id字段类型、长度,和question_subject表主键name的类型、长度完全一致,均为varchar(255),如果不一致手动修改subject_id字段属性 - 校验
question_question表中所有subject_id字段的非空值,都能在question_subject表的name字段中找到对应记录,删除或修正无效的外键值 - 重新执行迁移即可
内容的提问来源于stack exchange,提问作者amirhossein delkhosh
相关产品推荐
相关产品推荐

