2012-03-09 3 views
9

Я работаю с моделью, подобной модели, которая имеет DateTimeField (auto_now_add = True), чтобы фиксировать дату публикации (pub_date). Это выглядит примерно так:Группировка записей модели Django по дням с использованием поля datetime

Я хочу, чтобы сделать запрос, который подсчитывает, сколько сообщений статьи или записи, которые были добавлены в день. Другими словами, я хочу запрашивать записи и группировать их по дням (и, в конечном счете, месяц, час, секунда и т. Д.). Это будет выглядеть примерно следующее в SQLite оболочки:

select pub_date, count(id) from "myapp_article" 
where id = 1 
group by strftime("%d", pub_date) 
; 

который возвращает что-то вроде:

2012-03-07 18:08:57.456761|5 
2012-03-08 18:08:57.456761|9 
2012-03-09 18:08:57.456761|1 

Я не могу показаться, чтобы выяснить, как получить этот результат с Django QuerySet. Я знаю, как получить a similar result using itertools.groupby, но это невозможно в этой ситуации (объяснение следует).

Конечный результат этого запроса будет использован в графике, показывающем количество сообщений в день. Я пытаюсь использовать пакет Django Chartit для достижения этой цели. Chartit ставит ограничение на источник данных (DataPool). Источник должен быть Model, Manager или QuerySet, поэтому использование itertools.groupby не является опцией, насколько я могу судить.

Итак, вопрос в том, как ... Как мне группировать или суммировать записи по дням и заканчивать с помощью объекта QuerySet?

ответ

31

Создать дополнительное поле, что только дата хранения данных (не раз) и аннотирования с графом:

Article.objects.extra({'published':"date(pub_date)"}).values('published').annotate(count=Count('id')) 

Результат будет:

published,count 
2012-03-07,5 
2012-03-08,9 
2012-03-09,1 
+0

что, если мы хотим, чтобы получить все записи, кроме считать для каждого pub_date в том же запросе? –

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

  • Нет связанных вопросов^_^