Группировка записей модели Django по дням с использованием поля datetime - PullRequest
9 голосов
/ 09 марта 2012

Я работаю с моделью, подобной Статье, у которой есть 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

Кажется, я не могу понять, как получить этот результат изДжанго QuerySet.Я знаю, как получить аналогичный результат, используя itertools.groupby , но это невозможно в этой ситуации (пояснение приведено ниже).

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

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

1 Ответ

31 голосов
/ 24 мая 2012

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

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
...