2016-08-29 98 views
0

我有一個排序Django的查詢集使用Python列表

Model Car(self.Models) 
# a bunch of features here 

然後在我的views.py,我讓所有的汽車並計算他們的分數:

allCars = Car.object.all() # so you get [A, B, C, D] 
scoreList = someComputation(allCars) # returns [3,1,2,4] 

然後在我的模板我遍歷所有的車輛來顯示它們;使用排序查詢返回與我得到主鍵排序,因此

  1. 一個
  2. Ç
  3. d

不過,我想知道是否有一種方法使用在視圖中計算的列表來訂購查詢集,這將產生

  1. Ç
  2. 一個
  3. d

所以做這樣的事情

allCars.order_by(scoreList) 
+0

那是一個隨機排序,或者是特定的自定義排序?如果是這樣,邏輯是什麼? – karthikr

+0

在我的特殊情況下,根據模型中的特徵進行特定排序(更好的安全等級增加了分數,減少燃料效率,等等)。我在這裏使用汽車作爲一個通用示例。同樣的問題代表其他順序,雖然隨機我知道你可以只是order_by('?') – XenoChrist

+0

如果你需要一個很好的答案,你需要更具體的你正在尋找什麼。例如,你會排序的一些示例標準,等等。 – karthikr

回答

2

首先,要回答你的問題,你不能使用ORM/SQL整理東西這是從具有複雜邏輯的記錄中派生出來的,除非它只是純粹的數學運算,而數據庫可以在某種程度上做到這一點。

你的下一個選擇是使用python構建排序。但是,您無法使用「全力以赴」和「全力吐出」功能對項目進行排序,這意味着您的當前功能正在採用整個列表並計算得分並返回所有得分,因爲您失去了對應於哪輛車。

我會用模型上的函數來計算分數,然後記錄相應的分類:

class Car(models.Model): 
    @property 
    def compute_score(self): 
     return a_score_based_on_current_car 

cars = Car.objects.all() 
cars = sorted(cars, key=lambda car: car.compute_score) 
+0

我明白了。如果賦值得分值的邏輯也取決於其他表中包含的記錄,那麼我唯一的選擇是將查詢集提取到python列表中,並在將它傳遞給模板之前進行排序?我認爲這對我有意義。 – XenoChrist

+1

是的,我很害怕,我提供的方法可以在任何python列表中完成。這只是因爲你沒有根據數據庫字段進行排序,所以你不能利用數據庫排序的力量,這可能會讓事情變得更慢。但是,如果這是你唯一的選擇,那麼蟒蛇排序是下一個最好的事情。 –

+0

這對我來說是公平的權衡。 – XenoChrist