Группировка записей модели Django по дням с использованием поля даты и времени

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

class Article(models.Model):
    text = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)

Я хочу сделать запрос, который подсчитывает, сколько статей или записей было добавлено в день. Другими словами, я хочу запросить записи и сгруппировать их по дням (и, в конечном итоге, по месяцам, часам, секундам и т. д.). В оболочке 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. Я знаю, как получить аналогичный результат с помощью itertools.groupby, но это невозможно в данной ситуации (пояснение далее).

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

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


person pumazi    schedule 09.03.2012    source источник


Ответы (1)


Создайте дополнительное поле, в котором хранятся только данные даты (не время) и аннотируйте с помощью Count:

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
person Murat Çorlu    schedule 23.05.2012
comment
что, если мы хотим получить все записи, кроме count, для каждой pub_date в одном запросе? - person r.bhardwaj; 09.03.2016