2014-03-27 89 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