Сводить результаты запроса в один список - PullRequest
2 голосов
/ 21 февраля 2012

У меня есть модель X, содержащая ManyToManyField Y, я пытаюсь объединить результаты набора запросов X в список всех записей в Y

Я знаю, что «легкий» путь был бы:

for x in X:
    for y in x.Y.all():
        list.append(y)

Обоснование этого связано с моим предыдущим вопросом: Если x в синтаксис

Заранее спасибо,

Ответы [ 3 ]

3 голосов
/ 21 февраля 2012

Использование itertools.chain:

from itertools import chain

chain(SomeModel.objects.all(), OtherModel.objects.all(), ...)

Помните, что chain возвращает итерацию, что означает, что вы можете использовать ее для циклов и т. Д., Но вы не сможете отфильтровать наборы запросов далееили выполните обычные операции со списком.

0 голосов
/ 21 февраля 2012

Переверните запрос.Вы заинтересованы в Ys, поэтому вы должны запросить Ys.

y_list = Y.objects.filter(x__in=X)
0 голосов
/ 21 февраля 2012

Вы можете попробовать объединить объекты набора запросов в составном генераторе:

chained = itertools.chain(*[x.Y.all() for x in X])
print chained
# <itertools.chain object at 0x10100eb90>

for y in chained:
    print y
...