Как использовать prefetch_related для двух значений M2M?
Я хочу 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')
И я пытаюсь получить доступ к значениям, как показано ниже,
Метод A:
for each_obj in a_obj:
print(each_obj.a__b__c)
Метод B:
for each_obj in a_obj:
print(each_obj.a.all())
Метод A выбрасывает ошибку, говоря No such value a__b__b for A found
.
Метод B не выбрасывает никакой ошибки, но количество запросов увеличивается до длины a_obj.
Есть ли способ получить доступ к a__b__c
в одном запросе?
Вы загружаете обе связанные модели B
и C
с помощью .prefetch_related(…)
[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 уже загрузит объекты заранее, чтобы избежать лишних запросов.