将查询集连接到列表是最简单的方法。如果无论如何将对所有查询集命中数据库(例如,由于需要对结果进行排序),则不会增加成本。
from itertools import chain
result_list = list(chain(page_list, article_list, post_list))
使用itertools.chain
比itertools
在C中实现每个列表和一个元素一个一个地循环添加要快。与在串联之前将每个查询集转换为列表相比,它消耗的内存更少。
现在可以按日期对结果列表进行排序(按照hasen j对另一个答案的评论中的要求)。该sorted()函数方便地接受生成器并返回列表:
result_list = sorted(
chain(page_list, article_list, post_list),
key=lambda instance: instance.date_created)
如果你使用的是Python 2.4或更高版本,则可以使用attrgetter
而不是lambda。我记得曾经读过关于它更快的文章,但是对于一百万个项目,我没有看到明显的速度差异。
from operator import attrgetter
result_list = sorted(
chain(page_list, article_list, post_list),
key=attrgetter('date_created'))