Как использовать 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 уже загрузит объекты заранее, чтобы избежать лишних запросов.

Вернуться на верх