使用Django ORM按日期排序和分组对象

0 投票
2 回答
2515 浏览
提问于 2025-04-15 18:45

我有一个文章模型,这个模型里有一个日期字段。我想查询所有的文章对象,并且希望能得到一个数据结构,里面包含每个不同的年份,以及每个年份下的每个月份。

比如说,结果可能是这样的:

archives = { 2009: {12, [, , ...], 11: [...]}, 2008: {12, [...], 11: [...]}, }

这样做可以吗?

2 个回答

0

没有快速的解决办法,不过你可以看看dates()这个方法。

4

这种问题似乎经常出现。最简单的解决办法就是遍历数据,把对象按年和月分组。你可以在视图中手动完成这项工作,或者在模板中使用regroup。这主要取决于你想如何处理这些数据。

如果在你的应用中,按年和月分组归档是一个非常常见的操作,你可能想考虑创建一个年和月的字段,并在保存时填充这些字段。

手动分组的方式可能像这样:

arch = {}
for a in Archive.objects.all():
    year = arch.get(a.pub_date.year, {})
    month = year.get(a.pub_date.month, [])
    month.append(a)
    year[a.pub_date.month] = month
    arch[a.pub_date.year] = year

或者把所有的分组逻辑放到模板中,使用regroup(未测试):

{% regroup archives by pub_date.year as year_list %}
{% for year in year_list %}
  Year: {{ year.grouper }}
  {% regroup year.list by pub_date.month as month_list %}
  {% for month in month_list %}
    Month: {{ month.grouper }}
    {% for archive in month.list %}
      {{ archive }}
    {% endfor %}
  {% endfor %}
{% endfor %}

我个人会尝试把逻辑放在视图中,而不是模板里。

这里有一些相关的帖子:

撰写回答