我要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(…)
加载相关的B
和C
模型[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已经提前加载了这些对象,以防止额外的查询。