在Django中分组日期

ine*_*ine 15 python django django-forms

我的问题与这篇文章几乎完全相同,只是我使用的是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 
Run Code Online (Sandbox Code Playgroud)

并输出:

2009-01-01  
1  
2   
2009-01-02  
3  
2009-01-03  
4  
5  
Run Code Online (Sandbox Code Playgroud)

我可以通过循环排序日期并在我的python视图文件中将HTML输出到一个字符串来手动破解某些东西,但我想知道:有更好的方法使用Django模板或漂亮的Python功能吗?

小智 31

您可以使用重新组合日期模板标签来解决此问题.

{% regroup object_list by start_date|date:"Y-m-d" as objects_by_day %}
{% for d in objects_by_day %}
### DO SOMETHING HERE
{% endfor %}
Run Code Online (Sandbox Code Playgroud)


Tri*_*ych 15

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
Run Code Online (Sandbox Code Playgroud)

上面的代码打印出以下内容:

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')
Run Code Online (Sandbox Code Playgroud)


tba*_*ack 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')
Run Code Online (Sandbox Code Playgroud)


hug*_*own 8

如果OP可以在模板代码中使用python,这些都是合理的答案.(在那个帐户上,我赞成使用itertools.groupby()解决方案.)但是你不能在模板代码中使用python.在最好的情况下,您将编写执行此操作的模板标签.并且已经有一个模板标签可以做到这一点.

要在模板中的Django中进行分组,请使用regroup:

{% regroup people by gender as gender_list %}

<ul>
{% for gender in gender_list %}
    <li>{{ gender.grouper }}
    <ul>
        {% for item in gender.list %}
        <li>{{ item.first_name }} {{ item.last_name }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

示例取消了Django重新组合文档.重组是在Django可用0.96,1.01.1,至少.

如果你让我知道传递给模板的内容,我可以破解一个使用你的数据的例子.

此外,还有一篇博文,其中DjangoGrrl正是通过这个问题来解决的.