2014-03-27 88 views
1

我查询两种型号:合并排序的查询集 - Django的

q1 = sorted(Model1.objects.filter(name__iexact=name), key = lambda p: p.sumjournals) 
q2 = sorted(Model2.objects.filter(name__iexact=name), key = lambda p: p.sumbooks) 

sumbooks, sumjournals分别给出了所有的书籍和期刊的总和。

伪结果是:

q1 = [1, 3, 5, 8, 10] 
q2 = [3, 6, 8, 11, 14] 

我想:all = [1, 3, 3, 5, 6, 8, 8, 10, 11, 14 ]。数字在这里是对象。

我试图

all = [] 
all.extend(y for y in (q1) if y) 
all.extend(y for y in (q2) if y) 

但问题是,我得到不同的结果排序每次我加载页面。为什么会发生这种情况,我如何实现我想要的?

回答

2
import itertools 

joined = itertools.chain(q1, q2) 
sorter = lambda x: x.sumbooks if has_attr(x, 'sumbooks') else x.sumjournals 
all = sorted(joined, key = sorter) 

hasattr和细节itertools文档

+0

感谢让我试试这个 – doniyor

+0

,所以我更好地不这样做的拉姆达事情Q1和Q2,对不对?因为我后来在排序()? – doniyor

+0

是的,很可能你不需要对'q1'和'q2'进行排序,我只是不确定itertools如何使用django查询集,因为它们是懒惰评估的(如果我没有错误的话)。无论如何,如果懒惰的评估导致itertools的任何麻烦,您总是可以通过'materialized_q1 = list(q1)'实现查询集。 – J0HN