查询Django查询集而不创建新的查询集?

我甚至不确定我是否正确地陈述了这个问题。 这是情况。 我有一个通过访问外键关系生成的查询集。 在Django文档中使用标准的Blog / Entry模型,假设我选择了一个博客,并且现在有一组条目:

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调用。 但它确实看起来很丑。


抵制把所有东西放在一个线上的冲动 - 我认为这样的代码会更干净:

from collections import defaultdict
calendar = defaultdict(list)

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

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

链接地址: http://www.djcxy.com/p/76433.html

上一篇: Query a Django queryset without creating a new queryset?

下一篇: Oracle Advanced Queue Listen .Net WCF