Django中Prestamo模型迁移失败,外键约束冲突求助
解决Django中Prestamo模型迁移的外键约束错误
报错原因
报错信息显示,操作lector_prestamo表时违反外键约束:尝试插入/更新的libro_id=0在libro_libro表中不存在,触发数据库完整性校验失败。
解决方案
1. 清理无效数据
如果数据库中已有lector_prestamo的旧记录,检查是否存在libro_id=0的无效条目,直接删除后重新迁移:
DELETE FROM lector_prestamo WHERE libro_id = 0;
执行完成后运行迁移命令:
python manage.py migrate
2. 排查迁移文件中的默认值
查看对应Prestamo模型的迁移文件(路径类似app/migrations/xxxx_prestamo.py),检查libro字段是否被设置过default=0的残留配置。如果有,将默认值修改为libro_libro表中已存在的ID,或直接删除默认值配置,再重新执行迁移。
3. 临时允许外键为NULL修复
如果迁移时需要填充历史数据但无有效Libro记录,可临时修改模型:
class Prestamo(models.Model): lector = models.ForeignKey(Lector, on_delete=models.CASCADE) # 临时添加null=True libro = models.ForeignKey(Libro, on_delete=models.CASCADE, related_name='libro_prestamo', null=True) fecha_prestamo = models.DateField() fecha_devolucion = models.DateField(blank=True, null=True) devuelto = models.BooleanField()
生成并执行迁移:
python manage.py makemigrations python manage.py migrate
手动为所有Prestamo记录关联有效Libro实例后,再将模型改回libro字段null=False,重新生成并执行迁移。
4. 确认Libro表状态
确保Libro模型的迁移已执行完毕,且libro_libro表中存在至少一条有效记录(ID不为0)。若Libro表为空,先创建几个Libro实例再迁移Prestamo。
内容的提问来源于stack exchange,提问作者Facu
相关产品推荐
相关产品推荐

