Django中外键关联Flight与Airport创建实例触发ValueError
问题排查与解决:Django外键字段赋值错误
错误原因
Flight模型的origin和destination是ForeignKey类型字段,Django要求这类字段必须传入关联模型(Airport)的实例对象,或者该实例的主键ID(数字)。直接传入字符串"New York"不符合字段类型要求,因此触发ValueError。
解决方案
方法1:先查询Airport实例再创建Flight
先通过城市名/机场编码查询到对应的Airport对象,再传入Flight构造方法:
# 从flights.models导入模型 from flights.models import Airport, Flight # 查询目标机场实例(建议用code查询,避免城市名重复) ny_airport = Airport.objects.get(code="JFK") london_airport = Airport.objects.get(code="LHR") # 创建并保存Flight实例 f = Flight(origin=ny_airport, destination=london_airport, duration=818) f.save()
方法2:直接使用主键ID赋值
从你的查询结果可知,New York机场的主键ID是1,London是2,Django允许通过字段名_id的形式直接传入主键值:
f = Flight(origin_id=1, destination_id=2, duration=818) f.save()
注意事项
- 使用
get()查询时,如果找不到匹配记录会抛出DoesNotExist异常,建议用filter().first()做安全查询:
ny_airport = Airport.objects.filter(city="New York").first() london_airport = Airport.objects.filter(city="London").first() if ny_airport and london_airport: f = Flight(origin=ny_airport, destination=london_airport, duration=818) f.save()
- 优先用机场编码(code)查询,因为城市名可能存在重复,编码更唯一。
内容的提问来源于stack exchange,提问作者Janardhan Reddy
相关产品推荐
相关产品推荐

