我有一个带有日期字段的文章模型。我想查询所有 Article 对象,并在每个不同的年份返回一个数据类型,然后在其中的每个不同的月份返回一个数据类型。
例如
archives = {
2009: {12, [, , ...], 11: [...]},
2008: {12, [...], 11: [...]},
}
这可能吗?
我有一个带有日期字段的文章模型。我想查询所有 Article 对象,并在每个不同的年份返回一个数据类型,然后在其中的每个不同的月份返回一个数据类型。
例如
archives = {
2009: {12, [, , ...], 11: [...]},
2008: {12, [...], 11: [...]},
}
这可能吗?
这类问题似乎经常出现。最简单的解决方案是遍历数据并按年和月对对象进行分组。您可以在视图中手动执行此操作,也可以在模板中使用重新组合。这实际上取决于您想对数据做什么。
如果按年和月对档案进行分组是您在应用程序中非常常见的事情,您可能需要考虑创建一个年和月字段,然后在 save() 中填充该字段。
手动可能是这样的:
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 %}
我个人会尝试将逻辑放在视图中而不是模板中。
以下是一些相关的帖子:
没有快速的解决方案,但您可以检查dates()方法。