2010-06-29 93 views
1

我試圖選擇文章表中的所有對象,並按他們的日期分組。我想它可能會類似於此:如何在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

回答

3

這是一個工作的例子,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

2
+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

相關問題