2016-07-27 222 views
1

我有一個從redis排序的集合。排序後的集合包含對象的ID和它們的排序分數。基於從redis排序的集合排序Django查詢集

接下來,我有一個Django查詢集,其中的對象的排序標識包含在上述的redis排序集中。

我需要根據redis排序集中ID的位置來對此Django查詢集進行排序。什麼是實現這個目標的最快方法?


我想以下幾點:

dictionary = dict(sorted_set) #turning the sorted set into a dictionary 
    for pk, score in dictionary: 
     obj = queryset.get(id=pk) #get object with id equalling pk 
     score = object #assign the object to the 'score' value of this key-value 
    result = dictionary.values() #making a list of all values, that are now in sorted order 

for循環上面的失敗對我來說有too many values to unpack錯誤 - 我還在調試它。不過,我也覺得可能有更快的方法來做我想做的事情,因此我問了這個問題。提前致謝!

回答

1

更換你的for循環使用:

result = sorted(queryset, key=lambda item: dictionary[item.pk], reverse=True) 

這將異常冷清,如果在QS東西是不是在Redis的結果 - 使用dictionary.get(item.pk, ...)一些明智的默認,而不是dictionary[item.pk]如果可能發生。

+0

感謝哥們,我會盡快回復你 –

+0

如果查詢集中某些id *不存在*,但存在於sorted_set中?在這種情況下,lambda函數將返回'queryset'中不存在的'key'。結果自動排除這些條目? –

+0

在這種情況下'sorted'排序第一個參數 - queryset的元素。 'key'只是定義瞭如何計算第一個參數的每個元素的排序優先級,因此它會忽略排序集中而不是查詢集中的元素。另一個可能更乾淨地顯示行爲的例子是按長度排序字符串列表 - 「sorted(list_of_strings,key = len)'。任何字符串的長度都可以計算出來,但是隻有初始列表中的那些字符串纔會被排序。 –