2016-05-08 55 views
1

我試圖創建一個Django queryset,它以與ID列表相匹配的特定順序返回記錄。使用特定順序的ID列表從Django數據庫中獲取記錄

我的ID列表是:

[34,12,4,89,3,67,11] 

如果我運行下面的查詢:

queryset = Item.objects.filter(pk__in=[34,12,4,89,3,67,11]) 

查詢返回的ID順序記錄:

3,4,11,12,34,67,89 

有什麼使查詢以與列表相同的順序返回記錄的方法?

如果沒有,是否有辦法將查詢結果重新排序爲所需的順序?

+0

是控制命令你確定(34,12,4,...)相關的屬性模型上的呢? –

+0

這裏有一個潛在的相關問題 - http://stackoverflow.com/questions/883575/custom-ordering-in-django,雖然我不認爲你要找的是可能的,而不需要將查詢集轉換爲像一個列表,然後手動排序,例如使用自定義lambda。 –

+0

否id列表與模型無關。 –

回答

1

注意:添加這個作爲答案是因爲OP詢問了原始問題的評論中的方法。在評論中顯示片段不允許圍欄代碼塊。

在對原始問題的評論中,我提到了一個替代解決方案,將您的訂單號碼存儲在模型字段中,以便有序查詢更簡單。

對此的一個用例是,如果您有一個對象的隊列,其中每個項目都是電影,並且用戶正在決定要觀看它們的順序。您可能想要讓Django管理員或用戶重新排序項目(因此使其成爲一個字段)。爲了一個簡單的例子,我們假設只有一個用戶,所以我們將在模型中構建排序,而不是通過Item和User模型來建立自定義表。

型號:

class Item(models.Model): 
    # ... 
    my_order = models.PositiveIntegerField(unique=True) 

設置屬性或者在創建或更高版本:

Item.objects.create(id=34, my_order=1) 
Item.objects.create(id=12, my_order=2) 
Item.objects.create(id=4, my_order=3) 
# ... 

當然,你可以創建他們和你希望的任何順序設置my_order,結果會仍然是一樣的。

檢索對象所需的順序:

queryset = Item.objects.order_by('my_order') 
+0

如果我想以預先指定的順序返回項目,但是每次搜索完成後我的ID列表都會更改,那麼解決方案就沒有問題。 –

相關問題