2009-06-29 50 views
44

我有一些記錄,我想基於計算值進行排序。得到的答覆over here ...像這樣:django - 將列表轉換回查詢集

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

在Profile類是這樣的:

class Profile(models.Model): 

    ... 

    @property 
    def reputation(self): 
     ... 

不幸的是,一般的觀點是期待一個QuerySet對象,並拋出一個錯誤,如果我給它一個列表。

有沒有辦法做到這一點,它返回一個查詢集

或...

我可以轉換列表到查詢集不知何故?在django文檔中找不到類似的東西。

我希望不要使數據非規範化,但我想我會如果我必須。

更新/答:

似乎得到查詢集回來的唯一方法是,如果你可以得到所有你的邏輯到SQL查詢。

當那是不可能的,(我認爲),你需要進行非規範化的數據

+2

是不是一個更好的問題「我如何將列表(或字典)傳遞到通用視圖」?我假設你是否解決了這個問題,那麼無論你是通過轉換爲查詢集還是不這樣做...... – 2009-06-30 09:45:47

+0

是的......這是,但我只是想知道是否有一種簡單的方法將其轉換爲一個查詢集,然後我去分叉通用視圖;) – Jiaaro 2009-06-30 16:17:01

+2

mods,這不是重複的。答案是這樣的一個不同的問題:「你不能這樣做,所以你必須做其他事情。」另一個問題描述了「別的東西」。 – Jiaaro 2015-08-06 15:32:06

回答

21

有在轉換數據列表回查詢是沒有意義的。查詢對象從不保存數據;它只是代表對數據庫的查詢。如果您將列表添加到查詢中,它將不得不再次獲取所有內容,並且這會是多餘的,而且性能方面非常糟糕。

你可以做什麼:

  • 描述reputation場是如何計算的;可能會以某種方式對數據庫中的數據進行排序。
  • 將視圖修改爲不需要查詢對象。如果它需要進行額外的過濾等等,這應該在任何排序之前完成,因爲排序會花費更少的時間和更少的條目(並且從數據庫中獲取更少的數據)。因此,您可以將篩選後的查詢對象發送到排序功能將它發送到模板之前(這不應該關心它是否是一個查詢或列表。)
70

好吧...這個職位是現在老了,但你可以做的就是讓所有的ids您的列表中的對象,然後執行model.objects.filter(pk__in=list_of_ids)