如何在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...)...}
这是一个工作的例子,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>]}]
'keyfunc = operator.attrgetter('pub_date')' – 2010-06-29 23:32:59
@Ignacio - 谢谢,我已经更新了我的示例代码。任何想法(大致)比使用lambda快多少? – sdolan 2010-06-29 23:37:02
它可能不是。 – 2010-06-29 23:40:47
有关于此的更多信息? – blackrobot 2010-06-29 23:00:37
需要更多信息?它需要一个迭代器和一个函数来从迭代器的元素中提取分组键。 – 2010-06-29 23:18:48
我的猜测是,OP希望ORM发出GROUP BY SQL查询,在这种情况下,这不会对他有所帮助。 – 2010-06-29 23:20:29
我不知道很多关于Django的,但我抬起头的文档,我想你想要的是在这个页面:http://docs.djangoproject .com/en/dev/topics/db/aggregation/ 我认为values()可能是你所需要的。 – 2010-06-29 23:22:16