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

如何按年月分组含日期属性的Django模型对象列表?

在Django中按年月分组日期相关的模型对象

我来帮你搞定这个按年月分组模型对象的需求,这里有两种实用方案,分别对应不同的使用场景:

方案一:数据库层面高效分组(推荐大数据量场景)

如果你的数据量比较大,直接在数据库层面完成分组能大幅减少内存占用,效率更高。我们可以利用Django ORM的values和filter来实现:

# 假设你要处理某个my_model实例下的所有list_v2对象
target_my_model = my_model.objects.get(pk=你的实例ID)

# 先获取所有唯一的年月组合
unique_month_year = target_my_model.date_list.values(
    'date__year', 'date__month'
).distinct()

# 遍历每个年月组合,获取对应的对象列表
grouped_objects = {}
for group in unique_month_year:
    year = group['date__year']
    month = group['date__month']
    # 用"年-月"作为字典键,也可以用元组(year, month)更严谨
    key = f"{year}-{month}"
    grouped_objects[key] = list(target_my_model.date_list.filter(
        date__year=year,
        date__month=month
    ))

这样得到的grouped_objects就是一个字典,键是年月字符串,值是对应年月的list_v2对象列表。

方案二:Python内存层面分组(适合已获取对象列表的场景)

如果你已经把所有list_v2对象查询到了内存中(比如你的list_objects),可以用Python标准库的itertools.groupby来分组,注意必须先按年月排序,因为groupby只会把连续的相同键分组:

from itertools import groupby

# 先按年份、月份排序对象
sorted_objects = sorted(list_objects, key=lambda obj: (obj.date.year, obj.date.month))

# 按年月分组
grouped_objects = {}
for (year, month), obj_group in groupby(sorted_objects, key=lambda obj: (obj.date.year, obj.date.month)):
    key = f"{year}-{month}"
    grouped_objects[key] = list(obj_group)

如果你想要像你示例中那样,把日期字符串也对应分组,可以顺便提取日期:

# 同时分组对象和日期字符串
grouped_dates = {}
for (year, month), obj_group in groupby(sorted_objects, key=lambda obj: (obj.date.year, obj.date.month)):
    obj_list = list(obj_group)
    key = f"{year}-{month}"
    grouped_dates[key] = {
        'objects': obj_list,
        'dates': [obj.date.strftime("%d-%m-%Y") for obj in obj_list]
    }

小提示

  • 如果你用的是DateTimeField而不是DateField,处理逻辑完全一样,因为date__year和date__month也适用于DateTimeField
  • 字典的键可以根据你的需求调整,比如用(year, month)元组比字符串更适合后续的日期计算

内容的提问来源于stack exchange,提问作者Zealot91

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:11:03