2009-05-30 93 views
5

嘿,我想根據django中的計算值對對象進行排序......我該怎麼做?如何根據django中的計算值進行排序

這裏是一個基於堆棧溢出,說明我的困境的例子用戶配置模式:

class Profile(models.Model): 
    user = models.ForeignKey(User) 

    def get_reputation(): 
     ... 
     return reputation 
    reputation = property(get_reputation) 

所以,說我想的信譽用戶進行排序。我怎麼做?我知道你不能只是這樣做:

Profile.objects.order_by("-reputation") 

感謝您的幫助大家:)

回答

3

如果你需要做排序在數據庫中(因爲你有很多的記錄,需要例如分頁它們),唯一真正的選擇是把口碑變成非規範化的領域(例如,在覆蓋save()更新方法在模型上)。

16

由於僅存的Python的運算代碼,你必須執行在Python中的排序,以及:

sorted (Profile.objects.all(), key = lambda p: p.reputation) 
+0

嘿,這是我問的問題的答案,但我接受了另一個,因爲它解決了我的問題...特別是S.洛特的評論。我upmodded你的答案雖然:) – Jiaaro 2009-05-31 02:52:32

+0

有沒有辦法讓這個返回一個查詢集而不是一個普通的Python列表(或將列表轉換爲一個查詢集)? – Jiaaro 2009-06-29 12:37:49

5

從Django-1.8開始,只要可以在SQL中呈現計算值,就可以使用query expressions對QuerySet進行排序。您也可以使用annotations作爲order_by條款。

from django.db.models import F 
Profile.objects.annotate(reputation=(F('<field>') + ...)).order_by("-reputation") 

+-*/**基本操作可以與F()使用。此外還有其他一些功能,如CountAvgMax,...

鏈接:

參見本SO Q & - 答:Order a QuerySet by aggregate field value

相關問題