You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django迁移及flight.objects.all()执行报错问题排查与解决

Django字段迁移及数据兼容问题解决方案

问题原因

  1. 迁移失败:原Flight表的origin/destination为字符字段,存储了字符串值(如Kathmandu)。改为外键后,Django会自动将字段替换为origin_id/destination_id(关联Airport表的整数主键),但原有字符串数据与Airport表的主键类型不匹配,且Airport表中无对应数据,触发完整性约束错误。
  2. 查询失败:迁移未完成时,数据库中尚未创建origin_id字段,因此执行Flight.objects.all()会提示字段不存在。

解决步骤

1. 回滚到修改字段前的状态

先将数据库回滚到字段仍为字符类型的正常状态,才能操作原有数据:

python manage.py migrate flights 000X

注:000X是修改字段前最后一次成功执行的迁移文件编号(比如初始迁移是0001_initial.py,则填0001),可查看flights/migrations/目录下的文件确认。

2. 处理Flight表原有数据

进入Django Shell操作数据:

python manage.py shell

方案一:保留数据,创建对应Airport记录

如果需要保留原有Flight数据,先创建匹配的Airport对象,再更新Flight字段:

from flights.models import Airport, Flight
# 创建原有Flight数据对应的Airport(根据实际城市和机场编码调整)
origin_airport = Airport.objects.create(city="Kathmandu", code="KTM")
# 若destination也有对应城市,同理创建
# dest_airport = Airport.objects.create(city="目标城市", code="机场编码")

# 更新Flight数据
flight = Flight.objects.get(pk=1)
flight.origin = origin_airport
# flight.destination = dest_airport
flight.save()

方案二:直接删除无用数据

如果不需要这条旧数据,直接删除即可:

from flights.models import Flight
Flight.objects.get(pk=1).delete()

3. 重新执行迁移

  1. 确保models.py中外键定义规范(建议将外键引用改为大写的'Airport',与类名保持一致):
origin = models.ForeignKey('Airport', on_delete=models.CASCADE, related_name="departure")
destination = models.ForeignKey('Airport', on_delete=models.CASCADE, related_name="arrival")
  1. 生成新的迁移文件:
python manage.py makemigrations
  1. 执行迁移:
python manage.py migrate

注意事项

  • 修改涉及数据结构的字段时,优先处理现有数据,避免迁移时触发完整性错误。
  • 生产环境操作前务必备份数据库,禁止直接删除数据,需先做数据映射验证。

内容的提问来源于stack exchange,提问作者Virtual

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:43:31