0

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

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

所以我们有一些博客条目,可能为零。然后我想说构建一个日历并指出哪些日子有博客条目。所以我的想法是迭代一个月中的天列表或其他什么,并检查条目查询集以获取具有该日期的条目。问题是,最好的方法是什么?我的第一个想法是做类似的事情

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

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

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

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

4

1 回答 1

2

抵制将所有内容放在一条线上的冲动 - 我认为代码会更干净,如下所示:

from collections import defaultdict
calendar = defaultdict(list)

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

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

于 2009-09-04T14:49:06.973 回答