当我在多个字段上使用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的元素上没有得到“数据”字段。
我看错地方了吗?
答案 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