2012-10-23 98 views
4

我有一個由(id,rank)組成的字典。我想對id執行一個Django查詢,這樣生成的查詢集按rank(降序)排序。如何通過外部值對Django QuerySet進行排序?

獲取查詢集很簡單:

rankings = {...} 
result = MyModel.objects.filter(id__in=rankings.keys()) 

好像答案應該包括某種形式的註解,我可以作爲ORDER_BY的一部分使用,但我無法弄清楚如何到達那裏。

編輯:我忽略提到,我需要的結果是一個QuerySet,因爲這是一個tastypie API管道的一部分。

+0

我不認爲你可以做到這一點。如何將這些值存儲在字段中? – dannyroa

+0

等級在每個查詢上發生變化。應用程序正在查看一組學校,並根據表達的偏好爲用戶排名。 –

回答

0

我想辦法解決這個問題的唯一方法是創建一個與主模型相關的新排名模型。在每個查詢中,我將排名項插入到該模型中,然後能夠通過關係執行order_by。 (使用註釋將排名添加到學校記錄。)

class UserSchoolRanking(models.Model): 
    user = models.ForeignKey(User) 
    school = models.ForeignKey(School) 
    rank = models.IntegerField() 

bulk_user_school_rank = [UserSchoolRank(user=user, school_id=k, rank=v) 
             for k, v in rankings.iteritems()] 
UserSchoolRank.objects.bulk_create(bulk_user_school_rank) 

schools = School.objects.filter(userschoolrank__user=user)\ 
       .annotate(rank=Min('userschoolrank__rank'))\ 
       .order_by('-userschoolrank__rank') 
2

是這樣的嗎?

rankings = { 1 : 2, 2: 1, ... } # i.e. { 'id' : 'ranking', ... } 
objects = list(MyModel.objects.filter(id__in=rankings.keys())) 
objects.sort(key=lambda obj: rankings[obj.id]) 
+1

有趣的解決方案。這種類型有多貴? – dannyroa

+0

這就是想法,但是對QuerySet沒有「排序」方法,所以我不認爲這個代碼有效。 –

+0

我編輯了代碼 - 您可以將QS轉換爲「List」,但它意味着立即評估QS。我不確定排序的效率,但我不確定是否有替代解決方案(當然,根據我所知,不涉及「Queryset」API) –

相關問題