2009-09-04 2 views
0

Даже не уверен, что правильно задаю вопрос. Вот ситуация. У меня есть запрос, сгенерированный путем доступа к отношениям внешнего ключа. Использование стандартных моделей Блог/запись в документации Django, скажем, я выбрал блог и теперь есть набор записей:Запросить набор запросов Django без создания нового набора запросов?

entries = Blog.objects.get(id=1).entry_set.all() 

Таким образом, мы имеем несколько записей для блога, возможно, ноль. Я хотел бы сказать, как построить календарь и указать, какие дни имеют записи в блоге. Таким образом, я думаю, что нужно перебирать список дней в месяце или что-то еще, а также проверять элементы запроса для записи с этой датой. Вопрос в том, что это лучший способ сделать это? Моя первая мысль была сделать что-то вроде

dayinfo = [] # we will iterate over this in the template 
for curday in month: 
    dayinfo.append({'day':curday, 'entry':entries.filter(day=curday)}) 

Проблема заключается в том, что вызов фильтра возвращает новый QuerySet, и генерирует новый SQL вызов для каждой итерации цикла. Мне просто нужно вырвать объект записи из записей, если он существует, и вставить его в мой календарь. Итак, каков наилучший способ сделать это? Я получил это для работы:

dayinfo.append({'day':day, 'entry':[e for e in entries if e.day == curday][0]}) 

Это не создает новые вызовы sql. Но это кажется уродливым.

ответ

2

поддавайтесь искушению поставить все на одной линии - Я думаю, что код будет чище что-то вроде этого:

from collections import defaultdict 
calendar = defaultdict(list) 

for entry in entries: 
    calendar[entry.day].append(entry) 

defaultdict часть проста, но вы можете инициализировать его со всеми дней через месяц, если вы планируете использовать цикл for в шаблоне. Также обратите внимание, что если вы используете Django 1.1, вы можете использовать новый метод annotate(), чтобы просто вычислить количество сообщений, если вы на самом деле не планируете создавать ссылки на отдельные сообщения.

+0

Спасибо, это было то, что мне было нужно. Это скорее общая проблема кодирования, чем проблема Django. Я знал, что есть более простой способ сделать то, что я пытаюсь сделать! – chacmool

Смежные вопросы