Django-ORM вместо python для цикла - PullRequest
0 голосов
/ 02 июня 2018

Привет, классные люди!

Такой простой вопрос, иногда я использовал циклический просмотр своих моделей с помощью цикла python for, это не очень хорошо для производительности веб-сайта.

У меня есть три модели:

class A(models.Model):
    Bs = ManyToManyField(B)

class B(models.Model):
    Cs = ManyToManyField(C)

class C(models.Model):
    name = CharField(max_length=100)

Если я хочу, чтобы все экземпляры модели C были связаны с экземпляром A ,как я продолжу, а не этот питон для цикла?

all_c = []
for b in a_instance.Bs.all():
    for c in b.Cs.all():
        all_c.append(c)

1 Ответ

0 голосов
/ 02 июня 2018

Вы можете использовать prefetch_related https://docs.djangoproject.com/en/2.0/ref/models/querysets/#prefetch-related

all_c = []
for b in a_instance.Bs.all().prefetch_related('Cs'):
    for c in b.Cs.all():
        all_c.append(c)

Но лучшим способом будет просто фильтрация по C модели

all_c = C.objects.filter(b_set__a_set__in=[a_instance])
# or if you need it to be list and not queryset
all_c = list(C.objects.filter(b_set__a_set__in=[a_instance]))
...