Django | Получение количества статей за месяц

У меня есть две модели Article и Author, реализованные следующим образом:

class Author(models.Model):
    name = models.CharField(max_length=50)

class Article(models.Model):
    name = models.CharField(max_length=50)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    pub_date = models.DateField()

На моем шаблоне я хочу построить график (используя chart.js на стороне frontend), показывающий публикации авторов в месяц, за последние 12 месяцев. Для этого мне нужно количество статей, опубликованных в каждом месяце.

Вот запрос для получения статей авторов:

articles = Article.objects.filter(author=author)
Как лучше всего получить подсчет за месяц?

Я думал о том, чтобы аннотировать каждый из двенадцати месяцев отдельно в QuerySet, но не нашел способа, который бы мне подошел.
В качестве альтернативы я думал о том, как решить эту проблему на JS-сайте в браузере пользователя.

Есть предложения/рекомендации?

Если вам нужно группировать данные в Django, вам придется использовать возможности агрегации ORM.

А чтобы использовать это в датах, вы можете использовать их вспомогательные функции ORM.

from django.db.models.functions import TruncMonth
from django.db.models import Count

Article.objects
    .filter(author=author)                 # Filter by the author   
    .annotate(month=TruncMonth('created')) # Truncate by month and add 'month' to values
    .values('month')                       # Group By month
    .annotate(count_id=Count('id'))        # Count the number of articles in the grouping
    .order_by('-month')[:12]               # Sort by months in descending order (latest to earliest) and get the 12 first results
Вернуться на верх