You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:31:07