2009-09-04 98 views
0

我甚至不确定我是否正确地陈述了这个问题。这是情况。我有一个通过访问外键关系生成的查询集。 Django文档中使用标准博客/入门车型,让我们说我已经选择了一个博客,现在有一组条目:查询Django查询集而不创建新的查询集?

entries = Blog.objects.get(id=1).entry_set.all() 

所以我们有一些条目的博客,可能为零。然后,我想说说构建一个日历并指出哪些日子有博客条目。因此,我的想法是迭代本月的任何日期列表或其他内容,并检查条目queryset以查找具有该日期的条目。问题是,做这件事的最好方法是什么?我的第一个想法是做类似

dayinfo = [] # we will iterate over this in the template 
for curday in month: 
    dayinfo.append({'day':curday, 'entry':entries.filter(day=curday)}) 

问题是过滤器调用返回一个新的queryset,并为每个循环迭代生成一个新的sql调用。我只需要从条目中抽取条目对象(如果存在)并将其粘贴到我的日历中。那么做到这一点的最好方法是什么?我确实得到了这个工作:

dayinfo.append({'day':day, 'entry':[e for e in entries if e.day == curday][0]}) 

这不会产生新的sql调用。但它确实看起来很丑。

回答

2

抵制冲动把一切都在同一行 - 我想代码将吸尘器是这样的:

from collections import defaultdict 
calendar = defaultdict(list) 

for entry in entries: 
    calendar[entry.day].append(entry) 

的defaultdict部分是简单的,但你可能要与所有的天初始化在一个月内如果你只是打算在模板中使用for循环。另外请注意,如果您使用的是Django 1.1,则可以使用新的annotate()方法来简单计算帖子数,如果您实际上并未计划生成指向各个帖子的链接。

+0

谢谢,那正是我所需要的。这是一个比Django问题更通用的编码问题。我知道有一种更简单的方式来做我想做的事! – chacmool 2009-09-04 15:07:38