2009-06-02 56 views
6

我從Foo模型中獲取最新的5行,該模型由日期時間字段排序。django - 重新排序後切片查詢集

qs = Foo.objects.all()[:5] 

在下面的步驟中,我要重新排序通過一些其它標準(實際上,通過在相反方向上的相同日期時間字段)的查詢集。但不允許在切片之後重新排序。 reverse()解除了第一個排序,給了我一個不同的查詢集。有沒有一種方法可以實現我想要的功能,而無需從查詢集創建列表並使用它進行排序?

回答

10

不,沒有辦法做到這一點。 order_by是數據庫上的一項操作,但是當您對查詢集進行切片時,將對其進行評估並在此後不返回數據庫。

聽起來像你已經知道的解決方案,但:運行reversed()對評估的問題。

qs = reversed(Foo.objects.all()[:5]) 
+0

所以我沒有錯過任何東西。謝謝。 – shanyu 2009-06-02 11:56:59

+0

我有同樣的問題,並按照丹尼爾的建議,但發現我不能在查詢集上使用count方法 – thchand 2012-02-08 21:20:27

13

order_by爲您提供SQL數據庫內排序。你已經在使用它,然後切片。在這一點上,結果被檢索到內存中。如果你想改變它們的順序,你需要使用Python內存中的排序來完成它,而不是ORM數據庫內排序。

在你的情況,丹尼爾已經給出了最好的解決辦法:因爲你只是想通過相同的字段進行排序,但在另外的順序,只是扭轉你的列表:

qs = Foo.objects.all()[:5] 
objs = reversed(qs) 

如果你有希望通過一些其他的字段進行排序,那麼你會用排序()函數的自定義按鍵功能:

qs = Foo.objects.all()[:5] 
objs = sorted(qs, key=lambda o: o.some_other_field) 
1

晚的答案,但是這只是爲我工作:

import random 
sorted(queryset[:10], key=lambda x: random.random())