使用多重查询时,Django Prefetch related_name不可见

时间:2019-03-03 21:26:05

标签: django database

当我在多个字段上使用django Prefetch对象(https://docs.djangoproject.com/en/2.2/ref/models/querysets/#prefetch-objects)时:

model_a.objects.prefetch_related(Prefetch(model_b__model_c), to_attr='data')

其中,model_a与model_b具有m2m关系,而model_c具有model_b的外键。 我似乎在返回的QuerySet的元素上没有得到“数据”字段。

我看错地方了吗?

1 个答案:

答案 0 :(得分:2)

首先,根据您描述的关系,Prefetch对象将需要这样构造(除非您为关系定义了related_name,在这种情况下,您需要名称,不附加_set):

Prefetch('model_b_set__model_c_set')

第二,实际上您正在做两个预取:

  • 第一个为每个model_b获取所有model_a个实例。
  • 第二个实例为每个model_c获取所有model_b个实例。

data是为第二次预取定义的,即model_b个实例上,而不是model_a上,它将包含model_c个实例的列表。所以您可以这样访问它:

a_models = ModelA.objects.prefetch_related(
    Prefetch('model_b_set__model_c_set'), 
    to_attr='data')
for a in a_models:
    for b in a.model_b_set.all():
        b.data # => contains a list of model_c instances