Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中的分组日期_Python_Django_Django Forms - Fatal编程技术网

Python Django中的分组日期

Python Django中的分组日期,python,django,django-forms,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 和输出: 2009-01-01 1 2 2009-01-02 3 2009-01-03 4 5 我可以通过循环排序

我的问题与几乎完全相同,只是我使用的是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  

我可以通过循环排序的日期并将HTML输出到python视图文件中的字符串中,手动将一些内容组合在一起,但我想知道:有没有更好的方法使用Django模板或漂亮的python功能?

如果您使用数据库的日期格式化函数去除时间(在select中),这会更容易. 然后可以按格式化列进行分组(使用列别名)

在这之后,您可以使用带有一点逻辑的循环将结果转换为您想要的结果。我还没有使用django的模板系统,但Python中的逻辑如下:

>>> rows = [(1,'2009-01-01'), (2,'2009-01-01'), (3, '2009-02-02'), \
(4, '2009-02-02'), (5, '2009-02-02')]
>>> topdate = None
>>> for r in rows:
...     if topdate <> r[1]:
...             topdate = r[1]
...             print r[1]
...     print r[0]
... 
2009-01-01
1
2
2009-02-02
3
4
5
>>行=[(1,'2009-01-01'),(2,'2009-01-01'),(3,'2009-02-02')\
(4, '2009-02-02'), (5, '2009-02-02')]
>>>topdate=无
>>>对于行中的r:
...     如果topdate r[1]:
...             topdate=r[1]
...             打印r[1]
...     打印r[0]
... 
2009-01-01
1.
2.
2009-02-02
3.
4.
5.
应该有一种直接的方法将其转换为django模板代码。

是您亲爱的朋友:

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')

如果OP可以在模板代码中使用python,那么这些都是合理的答案。(因此,我倾向于使用itertools.groupby()解决方案),但不能在模板代码中使用python。在最好的情况下,您应该编写一个执行此操作的templatetag。已经有一个templatetag可以实现这一点

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

{%按性别将人员重新分组为性别\u列表%}
    {性别列表中的性别百分比%}
  • {{gender.gropper}
      {gender.list%中项目的%s}
    • {{item.first_name}{{item.last_name}}
    • {%endfor%}
  • {%endfor%}
举个例子。在django中可以使用regroup,并且至少可以使用

如果你告诉我传递给模板的内容,我可以用你的数据做一个例子


此外,Djanggrrl在一个例子中正好解决了这个问题。

您可以使用regroup和date templatetags解决这个问题

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

在较大的数据集上执行报告时,
itertools.groupby
可能太慢。在这些情况下,我让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')

我可以对数据进行分组,但是模板系统中的“小逻辑”是什么样子的呢?我不相信你可以在Django模板中这样做。即使你可以,你也不会想。最好是:(1)视图代码或(2)一个可以使用真正Python的TEMPPLATETAG。我认为模板是MVC模型中视图的一部分。我认为您是否决定在视图(而不是控制器)中进行任何数据格式化取决于具体情况,但有时这是必要的。感谢您的回答,但我更愿意在使用Python的视图函数中进行此操作。Django的模板系统不是为处理这类内容而设计的。如果您想使用视图函数(不是在模板中,如最初所述:“有没有更好的方法使用Django模板或漂亮的Python功能?”),那么Dana the Sane的代码就在正确的轨道上,尽管我认为itertools.groupby()解决方案更完整,更具python风格。模板语言倾向于提供足够多的相同语言结构,您可以轻松地在两者之间转换(它们共享相同的目标字节码)。这不是粗鲁,但您是否使用Django编程?出于实际目的,只有基本的比较和赋值操作。查看不使用templatetags的可用内容:不幸的是,我使用的是0.96,但这对于1.0或更高版本的用户来说是一个很好的资源!结果表明,重组在0.96中可用。我最初并没有声明这一点,因为我没有在0.96中编程,也不知道您正在使用它。如果你还想在模板中进行转换,请尝试一下。太棒了!itertools.groupby正是我所寻找的。如果要在视图中执行此操作,您需要这样的内容:“def sidebar_date_list():from itertools import groupby data=[datetime.date(post.created_at.year,post.created_at.month,1)for post in post.objects.filter(publish=1)。order_by('-created_at')]返回{'months':[k代表k,u在groupby(data)]}请注意,必须对SQL进行排序,才能使用groupby()。“从这里开始:如果您想按天分组,也可以这样做:”def sidebar_date_list():from itertools import groupby data=[datetime.date(post.created_at.year,post.created_at.month,post.created_at.day),用于post.objects.filter(publish=1)。order_by('-created_at')]返回{'days':[k代表k,u在groupby(数据)]}”韦德下面的方法,在模板中这样做对我来说效果更好。额外的好处是,我可以使用基于日期的通用视图,并删除一些代码。我在大多数情况下都是这样做的,但没有意识到你可以在日期过滤器中混合。非常感谢!这正是我所寻找的。天哪,我怎么不知道这一点呢如果需要“日期部分”,请使用start_date.date。如果性能有问题,请考虑我的答案
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')