当我在多个字段上使用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/