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

在Django中使用prefetch_related时能否从同一queryset获取关联数据

Django关联查询避免额外查询Model_B的方案

完全可以实现,根据你的Model_A和Model_B的关联类型选择对应方法即可:

  • 如果是正向外键/一对一关联:直接把prefetch_related替换为select_related,Django会发起1次带JOIN的SQL查询,所有Model_B的关联数据会和Model_A数据在同一次查询结果里返回,后续遍历QuerySet取Model_B关联字段时,完全不会再对Model_B发起新查询。
    替换后代码:
    queryset = Model_A.objects.select_related('Model_B')
    
  • 如果是多对多/反向外键关联:这类关联场景无法通过JOIN在单次SQL中拿到所有关联数据,你当前写的prefetch_related已经是最优方案:只会先后发起2次查询(第一次查全量Model_A数据,第二次查所有关联的Model_B数据),之后Django会在Python层完成数据关联,后续取值也不会再对Model_B发起额外查询。

后续取值的通用写法(两种方案都适用,无额外查询):

for a_obj in queryset:
    # 此处取关联Model_B数据不会触发新查询
    print(a_obj.Model_B.需要的字段)

内容的提问来源于stack exchange,提问作者Aditya Mani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:36:03