使用Django ORM按日期排序和分组对象
我有一个文章模型,这个模型里有一个日期字段。我想查询所有的文章对象,并且希望能得到一个数据结构,里面包含每个不同的年份,以及每个年份下的每个月份。
比如说,结果可能是这样的:
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 %}
我个人会尝试把逻辑放在视图中,而不是模板里。
这里有一些相关的帖子: