我從Foo模型中獲取最新的5行,該模型由日期時間字段排序。django - 重新排序後切片查詢集
qs = Foo.objects.all()[:5]
在下面的步驟中,我要重新排序通過一些其它標準(實際上,通過在相反方向上的相同日期時間字段)的查詢集。但不允許在切片之後重新排序。 reverse()解除了第一個排序,給了我一個不同的查詢集。有沒有一種方法可以實現我想要的功能,而無需從查詢集創建列表並使用它進行排序?
我從Foo模型中獲取最新的5行,該模型由日期時間字段排序。django - 重新排序後切片查詢集
qs = Foo.objects.all()[:5]
在下面的步驟中,我要重新排序通過一些其它標準(實際上,通過在相反方向上的相同日期時間字段)的查詢集。但不允許在切片之後重新排序。 reverse()解除了第一個排序,給了我一個不同的查詢集。有沒有一種方法可以實現我想要的功能,而無需從查詢集創建列表並使用它進行排序?
不,沒有辦法做到這一點。 order_by
是數據庫上的一項操作,但是當您對查詢集進行切片時,將對其進行評估並在此後不返回數據庫。
聽起來像你已經知道的解決方案,但:運行reversed()
對評估的問題。
qs = reversed(Foo.objects.all()[:5])
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)
晚的答案,但是這只是爲我工作:
import random
sorted(queryset[:10], key=lambda x: random.random())
所以我沒有錯過任何東西。謝謝。 – shanyu 2009-06-02 11:56:59
我有同樣的問題,並按照丹尼爾的建議,但發現我不能在查詢集上使用count方法 – thchand 2012-02-08 21:20:27