如何在django获得过去12个月的总申请人数



我想在月份视图中获得最近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年3月的总申请人22和2021年3月总申请人20,此查询在created_at__month: 3中返回值42,但我只需要本月过去12个月的数据。

如何有效地编写此查询?

日期总是有点棘手,我会使用dateutil模块来帮助确定一年前的闰年。

获取本月第一天(2022年3月1日(

from django.utils.timezone import now
first_day_of_this_month = now().replace(day=1)

获取下个月的第一天(2022年4月1日(

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

减去1年(2021年4月1日(

from dateutil.relativedelta import relativedelta
first_day_of_twelve_months_ago = first_day_of_next_month - relativedelta(years=1)

开始当天(2021年4月1日凌晨12:00(

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

将您的申请人筛选为仅在2021年4月1日凌晨12:00 之后创建的申请人

Applicant.objects.filter(
created_at__gte=first_second_of_first_day_twelve_months_ago
).values("created_at__month").annotate(total=Count("created_at__month"))

最新更新