2011-11-09 45 views
3

我不想要將任何順序應用於查詢。所以,我有一個QuerySet遵循:如何更改查詢的默認排序?

question_obj = Question.objects.filter(pk__in=[100,50,27,35,10,42,68]).order_by() 

然而,當我檢索的結果,他們總是被questionID訂購。我遍歷question_obj這是結果:

for obj in question_obj: 
    obj.questionID 

的結果顯示,如:

10L 
27L 
35L 
42L 
50L 
68L 
100L 
+0

爲了以防萬一:您是否忽略了問題模型中的「class Meta」訂單聲明? –

+0

我不想訂購結果。我只想保持對象與主鍵列表相同的順序。 –

+1

@ThinhPhan如果你想讓命令跟隨PK,爲什麼不只是'.order_by('pk')'? – guival

回答

2

如果你想顯示在同一順序的對象作爲主鍵列表,那麼您可以使用in_bulk創建一個由pk鍵入的字典。然後,您可以使用列表理解來生成問題列表。

>>> pks = [100,50,27,35,10,42,68] 
>>> questions_dict = Question.objects.in_bulk(pks) 
>>> questions = [questions_dict[pk] for pk in pks] 
>>> for question in questions: 
     print question.pk 
100 
50 
27 
35 
... 
+0

一樣的順序非常感謝。這是我需要找到的解決方案 –

0

盧克,使用Source,呃文檔!是的,就是這樣!

Django QuerySet API - order_by()

+0

我想他不想在特定的領域訂購它們。相反,按照他們在提供的列表中建議的順序排列它們 –

+0

親愛的彼得羅威爾,我在我的聲明中使用了「Django QuerySet API - order_by()」,但它不起作用。 question_obj = Question.objects.filter(pk__in = [100,50,27,35,10,42,68])。order_by() 它總是返回questionID的順序。 –

+1

@ThinhPhan:我讀過「我不希望將任何命令應用於查詢」,意思是說你想要一個隨機命令。鑑於你接受的答案是正確的,你的意思是說「我希望按ID給出的順序返回對象」。有趣的是,當給查詢一個明確的ID列表(我認爲是一個錯誤的行爲)時,'order_by('?')'運算符默默地*沒有*。 –

1

如果你想要一個無序集合,使用Python集對象,記錄在這裏:http://docs.python.org/tutorial/datastructures.html#sets

如果你想排序是相同的作爲pk__in值傳遞的列表,你可以嘗試:

ids = [100,50,27,35,10,42,68] 
questions = list(Question.objects.filter(pk__in=ids)) 
question_obj = sorted(questions, key=lambda x: ids.index(x.id)) 

編輯:而且因爲它是非常不清楚你參考的數據結構是通過定義所指的「無序」什麼下令:隨機排序可通過以下方式實現:

.order_by('?') 
+0

尼斯提示與'。ORDER_BY( '?')'!! – jathanism

+0

order_by('?')查詢可能非常昂貴並且速度很慢,這取決於您使用的數據庫後端。 我剛剛保持與主鍵列表 –