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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:55:21