Django创建带ForeignKey外键的MLBGame模型对象失败如何解决
错误原因
你在给MLBGame的外键字段传值时,传入的是字符串类型的球队名team.name,但Django外键字段要求必须传入关联的模型实例,或使用字段名_id的格式传入关联表的主键值。
正确实现代码
方案1:直接传入TeamName实例
# 先查询对应球队实例,该写法本身没有问题,前提是TeamName表中存在name等于game.away_team的记录 team = TeamName.objects.get(name=game.away_team) MLBGame.objects.update_or_create( gameID=gameID, defaults={ "name": team, # 直接传入查询得到的TeamName实例即可 # 其余字段参数 } )
方案2:传入关联表主键值
如果不想直接传递实例,也可以通过外键字段名加_id后缀的方式,直接传入TeamName的主键:
team = TeamName.objects.get(name=game.away_team) MLBGame.objects.update_or_create( gameID=gameID, defaults={ "name_id": team.pk, # 其余字段参数 } )
注意事项
- 你当前用
get查询TeamName实例的写法,如果对应球队不存在会直接抛出DoesNotExist异常,建议提前做兼容处理:team = TeamName.objects.filter(name=game.away_team).first() if not team: # 自定义不存在对应球队时的处理逻辑,例如先创建球队实例 team = TeamName.objects.create( name=game.away_team, abbreviation="你的球队缩写", twitter_id=game.away_team ) - 你当前外键字段取名为
name非常容易和TeamName表自身的name字段混淆,建议修改为team或belong_team等语义更明确的名称,降低后续维护成本。
内容的提问来源于stack exchange,提问作者Ryan Thomas
相关产品推荐
相关产品推荐

