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

时间:2010-02-01 23:29:33

标签: python django django-orm

我有一个具有日期字段的文章模型。我想查询所有Article对象,并返回每个不同年份的数据类型,然后是每个不同的月份。

例如

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

这可能吗?

2 个答案:

答案 0 :(得分:4)

这类问题似乎经常出现。最简单的解决方案是循环访问数据并按年和月分组对象。您可以在视图中手动执行此操作,也可以在模板中使用regroup。这实际上取决于您想要对数据做什么。

如果按年份和月份对存档进行分组是您在应用程序中执行的常见操作,则可能需要考虑创建在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 %}

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

以下是一些相关帖子:

答案 1 :(得分:0)

没有快速解决方案,但您可以检查dates()方法。