如何在两个M2M值上使用prefetch_related ?



我要prefetch_related到两个级别的M2M值,

这是我的models.py

class A(models.Model):
name = models.CharField(max_length=40)
b = models.ManyToManyField('B')
class B(models.Model):
name = models.CharField(max_length=40)
c = models.ManyToManyField('C')
class C(models.Model):
name = models.CharField(max_length=40)
d = models.ManyToManyField('D')

ORM是

a_obj = A.objects.all().prefetch_related('a__b__c')

我尝试访问下面的值,

方法:

for each_obj in a_obj:
print(each_obj.a__b__c)

方法B:

for each_obj in a_obj:
print(each_obj.a.all())

方法No such value a__b__b for A found抛出一个错误方法B不会抛出任何错误,但是查询的数量会增加到a_obj的长度。

是否有办法访问a__b__c在一个单一的查询?

使用.prefetch_related(…)加载相关的BC模型[Django-doc]<一口>:

a_objs = A.objects.prefetch_related('b__c')

但这里.prefetch_related(…)不改变项目的外观,它只是加载项目。因此,您可以使用以下命令访问它们:

for a in a_objs:
for b in a.b.all():
for c in b.c.all():
print(f'{a} {b} {c}')

你仍然以同样的方式访问条目,但这里Django已经提前加载了这些对象,以防止额外的查询。

最新更新