在Django中分组日期
我的问题几乎和这个帖子一模一样,只是我用的是Python和Django,而不是PHP。
任务是要处理:
id date
1 2009-01-01 10:15:23
2 2009-01-01 13:21:29
3 2009-01-02 01:03:13
4 2009-01-03 12:20:19
5 2009-01-03 13:01:06
然后输出:
2009-01-01
1
2
2009-01-02
3
2009-01-03
4
5
我可以通过在我的Python视图文件中循环遍历排序后的日期,手动拼凑一些东西并把HTML输出到一个字符串里,但我在想:有没有更好的方法可以使用Django模板或者一些巧妙的Python功能呢?
5 个回答
9
在处理较大数据集的报告时,使用 itertools.group_by
可能会太慢。在这种情况下,我会让 Postgres 来处理分组:
truncate_date = connection.ops.date_trunc_sql('day','timestamp')
qs = qs.extra({'date':truncate_date})
return qs.values('date').annotate(Sum('amount')).order_by('date')
16
itertools.groupby
是你最好的朋友:
import itertools
dates = [
(1,'2009-01-01 10:15:23'),
(2,'2009-01-01 13:21:29'),
(3,'2009-01-02 01:03:13'),
(4,'2009-01-03 12:20:19'),
(5,'2009-01-03 13:01:06'),
]
for key,group in itertools.groupby(dates, key=lambda x: x[1][:11]):
print key
for element in group:
print ' ', element
上面的代码会输出以下内容:
2009-01-01
(1, '2009-01-01 10:15:23')
(2, '2009-01-01 13:21:29')
2009-01-02
(3, '2009-01-02 01:03:13')
2009-01-03
(4, '2009-01-03 12:20:19')
(5, '2009-01-03 13:01:06')
42
你可以通过使用 regroup 和 date 这两个模板标签来解决这个问题。
{% regroup object_list by start_date|date:"Y-m-d" as objects_by_day %}
{% for d in objects_by_day %}
### DO SOMETHING HERE
{% endfor %}