Как использовать Django ORM для получения списка по годам всех статей с количеством статей - PullRequest
4 голосов
/ 19 октября 2010

Я пытаюсь использовать django ORM, чтобы получить список по годам всех моих статей с количеством статей рядом с ними, например:

2010 (5 статей)
2009 (4 статьи)
2008 (9 статей)

Я пробовал такие вещи, как:

archive = Articles.objects.dates ('созданный', 'год'). Annotate (archive_count = Count («создано»))

или:

archive = Articles.objects.values ​​(«создано»). annotate (archive_count = Count («создано»))

или:

archive = Articles.objects.values ​​(«создано»). Aggregate (archive_count = Count («создано»))

Последний дал мне правильный счет, но не далКакое-либо из значений года, остальные дают сочетание либо ничего, либо значение archive_count, установленное в 1 для каждой строки.

Есть идеи, где я ошибаюсь?

Ответы [ 3 ]

5 голосов
/ 20 октября 2010

Вот способ сделать это одним запросом:

Article.objects.extra(select={'year':"strftime('%%Y',created)"}).values('year').order_by().annotate(Count('id'))

Обратите внимание, что вам придется заменить strftime('%%Y',created) в соответствии с вашей базой данных (я использовал sqlite).

2 голосов
/ 19 октября 2010

Я не уверен, сводит ли ваша база данных к минимуму ваша главная цель. Если так, может быть другой способ, который я не рассмотрел. Но на первый взгляд это выглядит так, как вы хотите:

archive={}
years = Article.objects.dates('created', 'year')
for year in years:
    archive[year.year] = Article.objects.filter(created__year=year.year).count()

Тогда у вас будет словарь с {2010: 5, 2009: 4, 2008: 9}.

1 голос
/ 20 октября 2010

В идеальном мире вы могли бы написать:

archive = Articles.objects.values('created__year').annotate(archive_count=Count('created')).order_by()

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

archive = Articles.objects.values('created').aggregate(archive_count=Count('created'))

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

Если вы действительно хотите сделать это с помощью одного вызова ORM, вам придется использовать дополнительную функцию и написать совершенно собственный SQL.В противном случае ответ Джастина должен сработать.

...