Django中current_company.game_set.all()关联Game模型的哪个字段?
Django反向关联:
game_set对应哪个字段? 首先得说清楚:你的代码其实有个小问题——当同一个模型(Game)有多个关联指向另一个模型(Company)时,Django会要求你给至少一个字段指定related_name参数,不然会因为反向关联的名称冲突报错。比如你应该把publishers字段改成这样:
publishers = models.ManyToManyField(Company, related_name='published_games')
回到你的核心问题:如果暂时忽略这个冲突,current_company.game_set.all()只会返回该公司作为开发者(对应Game里的developer外键字段)的所有游戏,和publishers多对多字段完全没关系。
为什么是这样?
- 对于
ForeignKey类型的关联,Django会自动生成一个反向关联管理器,默认命名规则是[关联模型小写名]_set。这里Game的developer是指向Company的外键,所以Company实例的这个反向管理器就是game_set,专门用来拉取所有把当前公司设为开发者的游戏。 - 而
ManyToManyField反向关联的默认命名也是[关联模型小写名]_set,这就和ForeignKey的反向名称撞车了,所以Django不允许这种情况,必须手动给publishers字段加related_name(比如上面的published_games),这样你就能用current_company.published_games.all()来获取该公司作为发行商的游戏了。
总结一下正确的用法:
- 获取公司开发的游戏:
current_company.game_set.all()(对应developer字段) - 获取公司发行的游戏:
current_company.published_games.all()(对应加了related_name的publishers字段)
内容的提问来源于stack exchange,提问作者Nurzhan Nogerbek
相关产品推荐
相关产品推荐

