Каков наилучший способ создания списка наборов запросов в Django? - PullRequest
1 голос
/ 27 января 2012

У меня есть класс модели «Место», в котором есть поле для «состояния», и я хотел бы получить список наборов запросов, сгруппированных по всем доступным различным состояниям в БД.

Я сейчас занимаюсь этим:

place_list = []
places = Place.objects.distinct('state')
[place_list.append( Place.objects.filter(state=p.state) ) for p in places]

Есть ли лучшая агрегатная команда, которую я мог бы использовать для оптимизации этого? Каков был бы лучший способ сделать это?

~ с использованием Python 2.6, Django 1.3.1

Ответы [ 3 ]

3 голосов
/ 27 января 2012

Как насчет того, чтобы получить только значения для состояний (values_list - удобный инструмент здесь):

states = Place.objects.values_list('state', flat=True).distinct()

и затем делайте то, что вы делали для каждого состояния, но используйте результаты вашего понимания списка и пропустите вызов .append ().

place_list = [Place.objects.filter(state=state) for state in states]

Это по-прежнему достигает значения счетчика БД + 1 раз, но вы только выполняете запрос для состояний в самом начале. Объекты QuerySet в place_list все еще будут ленивыми и не будут оцениваться, пока вы их не используете.

ПРИМЕЧАНИЕ: комментарий @pastylegs об использовании тега шаблона regroup в вашем шаблоне может быть самой проницательной вещью, которую сказал любой из нас. Мой ответ на самом деле просто показывает вам value_list и список понимания.

2 голосов
/ 27 января 2012
from collections import defaultdict

places_by_state = defaultdict(list)
for place in Place.objects.all():
   places_by_state[place.state].append(place)
list_of_places_by_state = places_by_state.values()

Это происходит в базе данных только один раз, а не один раз для каждого состояния, как в исходной версии (при условии, что вы используете все результаты), но в итоге вы получите список списков вместо списка наборов запросов.

0 голосов
/ 27 января 2012

Вы неправильно используете понимание списка.Понимание списка не для повторения действий, это для создания списков.Вот что я бы сделал:

places = Place.objects.distinct('state')
place_list = [Place.objects.filter(state=p.state) for p in places]

Это то же самое, что вы делали раньше, но я просто правильно использую понимание списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...