在Django中分组日期

18 投票
5 回答
9852 浏览
提问于 2025-04-15 13:25

我的问题几乎和这个帖子一模一样,只是我用的是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

你可以通过使用 regroupdate 这两个模板标签来解决这个问题。

{% regroup object_list by start_date|date:"Y-m-d" as objects_by_day %}
{% for d in objects_by_day %}
### DO SOMETHING HERE
{% endfor %}

撰写回答