如何在Django中按日期对对象进行分组?

问题描述:

我试图选择文章表中的所有对象,并按他们的日期分组。我想它可能会类似于此:如何在Django中按日期对对象进行分组?

articles = Article.objects.filter(pub_date__lte=datetime.date.today()).group_by(pub_date.day) 
articles = {'2010-01-01': (articleA, articleB, articleC...), 
      '2010-01-02': (article1, article2, article3...)...} 
+0

我不知道很多关于Django的,但我抬起头的文档,我想你想要的是在这个页面:http://docs.djangoproject .com/en/dev/topics/db/aggregation/ 我认为values()可能是你所需要的。 – 2010-06-29 23:22:16

这是一个工作的例子,ignacio建议使用itertools.groupby

class Article(object): 
    def __init__(self, pub_date): 
     self.pub_date = pub_date 


if __name__ == '__main__': 
    from datetime import date 
    import itertools 
    import operator 

    # You'll use your Article query here instead: 
    # a_list = Article.objects.filter(pub_date__lte = date.today()) 
    a_list = [ 
     Article(date(2010, 1, 2)), 
     Article(date(2010, 2, 3)), 
     Article(date(2010, 1, 2)), 
     Article(date(2011, 3, 2)), 
    ] 


    keyfunc = operator.attrgetter('pub_date') 

    a_list = sorted(a_list, key = keyfunc) 
    group_list = [{ k.strftime('%Y-%m-%d') : list(g)} 
        for k, g in itertools.groupby(a_list, keyfunc)] 

    print group_list 

输出:

[{'2010-01-02': [<__main__.Article object at 0xb76c4fec>, <__main__.Article object at 0xb76c604c>]}, {'2010-02-03': [<__main__.Article object at 0xb76c602c>]}, {'2011-03-02': [<__main__.Article object at 0xb76c606c>]}] 
+1

'keyfunc = operator.attrgetter('pub_date')' – 2010-06-29 23:32:59

+0

@Ignacio - 谢谢,我已经更新了我的示例代码。任何想法(大致)比使用lambda快多少? – sdolan 2010-06-29 23:37:02

+0

它可能不是。 – 2010-06-29 23:40:47

+0

有关于此的更多信息? – blackrobot 2010-06-29 23:00:37

+0

需要更多信息?它需要一个迭代器和一个函数来从迭代器的元素中提取分组键。 – 2010-06-29 23:18:48

+0

我的猜测是,OP希望ORM发出GROUP BY SQL查询,在这种情况下,这不会对他有所帮助。 – 2010-06-29 23:20:29

也许你应该在模板级别做呢?如果是这样,你只需要这个:regroup tempalte tag