在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
相关产品推荐
相关产品推荐

