Как получить общее количество заявителей за последние 12 месяцев в разбивке по месяцам в django

Я хочу получить данные о заявителях за последние 12 месяцев в режиме просмотра по месяцам. Если это март, то мне нужно получить данные [3,2,1,12,...,4] в этом сценарии. Вот моя модель:

class Applicant(models.Model):
    full_name = models.CharField(max_length=200, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True, auto_now=False)
    .....

Пока я пытаюсь выполнить запрос: Applicant.objects.values('created_at__month')annotate(total = Count('created_at__month')) он возвращает значения типа [{'created_at__month': 2, 'total': 3}, {'created_at__month': 3, 'total': 13}]. Если у меня есть 2022 месяц март всего заявителей 22 и 2021 месяц март всего заявителей 20, этот запрос вернет значение 42 в created_at__month: 3, но мне нужны только данные за последние 12 месяцев с этого месяца.

Как я могу написать этот запрос эффективно?

Даты всегда немного сложны, я бы использовал модуль dateutil, чтобы помочь определить год назад с учетом високосного года.

Получите первый день этого месяца (1 марта 2022 года)

from django.utils.timezone import now

first_day_of_this_month = now().replace(day=1)

Получить первый день следующего месяца (1 апреля 2022 года)

import datetime

first_day_of_next_month = (
    first_day_of_this_month + datetime.timedelta(days=32)
).replace(day=1)

Вычесть 1 год (1 апреля 2021 года)

from dateutil.relativedelta import relativedelta

first_day_of_twelve_months_ago = first_day_of_next_month - relativedelta(years=1)

Получите начало этого дня (1 апреля 2021 12:00AM)

first_second_of_first_day_twelve_months_ago = datetime.datetime.combine(
    first_day_of_twelve_months_ago, datetime.time.min
)

Отфильтруйте своих заявителей только на тех, которые были созданы после (gte) 1 апреля 2021 года 12:00AM

Applicant.objects.filter(
    created_at__gte=first_second_of_first_day_twelve_months_ago
).values("created_at__month").annotate(total=Count("created_at__month"))
Вернуться на верх