如何在Django中通过反向关联单查询访问外键关联对象
Django反向查询获取所有者的猫咪
现有模型的快速解决方法
Django对ForeignKey的反向关联默认会生成[模型名小写]_set格式的管理器,你可以直接用它获取该所有者的所有猫咪:
# 预取关联猫咪,确保单次查询完成 first_owner = Owner.objects.prefetch_related('cat_set').get(id=1) # 获取该所有者的所有猫咪 cats = first_owner.cat_set.all()
这里用prefetch_related避免后续调用cat_set.all()时触发额外数据库查询,实现单次查询的需求。
自定义反向关联名称(更贴合你的使用习惯)
如果你想让语法更接近first_owner.Cat(推荐用小写复数如cats,更符合Python编码规范),可以修改Cat模型的ForeignKey字段,添加related_name参数:
class Cat(models.Model): # 自定义反向关联名为cats,也可设为'Cat'(不推荐大写命名管理器) owner = models.ForeignKey(Owner, on_delete=models.CASCADE, related_name='cats') pseudo = models.CharField(max_length=200)
修改后即可这样查询:
# 预取关联猫咪,单次查询 first_owner = Owner.objects.prefetch_related('cats').get(id=1) # 获取所有猫咪 cats = first_owner.cats.all()
关键说明
- ForeignKey本身就支持反向关联,完全适配“每只猫仅有一个主人”的场景,不需要ManyToMany字段。
prefetch_related用于一对多反向关联的预取,能确保只执行一次数据库查询,避免N+1查询性能问题。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

