当我在多个字段上使用django预取对象(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')

其中,模型A与模型B有M2M关系,模型C有模型B的外键。
我似乎没有得到返回的queryset元素的“data”字段。
我是不是找错地方了?

最佳答案

首先,根据您描述的关系,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

关于django - 使用多重查询时,Django Prefetch related_name不可见,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54973908/

10-09 13:58