基于DateTime字段按月分组统计酒店预订量的Django查询实现
Django按月份分组统计预订记录数量
针对你的PaymentRequest模型,要实现按月份分组统计预订数量并输出{'jan':10, 'feb':11,...}格式的结果,可以用Django内置的数据库函数完成,适配新版本Django的写法如下:
步骤1:导入必要模块
from django.db.models import Count from django.db.models.functions import ExtractMonth
步骤2:分组统计月份数据
先排除arrival_date为空的无效记录,再提取月份数字并分组统计数量:
# 提取月份数字并分组统计有效预订记录 monthly_stats = PaymentRequest.objects.exclude(arrival_date__isnull=True).annotate( month=ExtractMonth('arrival_date') ).values('month').annotate(total=Count('id')).order_by('month')
步骤3:转换为月份缩写格式
把提取到的月份数字(1-12)转换成英文缩写,生成目标格式的字典:
# 月份数字与英文缩写的映射表 month_abbr_map = { 1: 'jan', 2: 'feb', 3: 'mar', 4: 'apr', 5: 'may', 6: 'jun', 7: 'jul', 8: 'aug', 9: 'sep', 10: 'oct', 11: 'nov', 12: 'dec' } # 转换为目标格式 result = {month_abbr_map[item['month']]: item['total'] for item in monthly_stats}
可选:补全所有月份(含数量为0的月份)
如果需要展示全年所有月份(哪怕该月份无预订记录),可先初始化全月份字典再填充数据:
# 初始化全年月份,默认数量为0 full_result = { 'jan': 0, 'feb': 0, 'mar': 0, 'apr': 0, 'may': 0, 'jun': 0, 'jul': 0, 'aug': 0, 'sep': 0, 'oct': 0, 'nov': 0, 'dec': 0 } # 覆盖有数据的月份 full_result.update(result)
说明
旧Stack Overflow方案失效是因为Django版本迭代,现在推荐用ExtractMonth这类内置数据库函数,它能适配不同数据库(MySQL、PostgreSQL等),写法更简洁规范。
内容的提问来源于stack exchange,提问作者haduki
相关产品推荐
相关产品推荐

