Как получить общее количество заявителей за последние 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"))