代码之家  ›  专栏  ›  技术社区  ›  damon Curtis Snowden

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

  •  1
  • damon Curtis Snowden  · 技术社区  · 15 年前

    我正在尝试选择articles表中的所有对象,并按它们的日期对它们进行分组。我想它看起来会像这样:

    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...)...}
    
    3 回复  |  直到 15 年前
        1
  •  4
  •   Sam Dolan    15 年前

    下面是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>]}]
    
        2
  •  2
  •   Ignacio Vazquez-Abrams    15 年前
        3
  •  0
  •   Aldarund    15 年前

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