2014-02-20 76 views
0

我在尋找獲取按field1,function,field2排序的QuerySet。如何按(字段,自定義函數,字段)對Django QuerySet進行排序

型號:

class Task(models.Model): 
    issue_id = models.CharField(max_length=20, unique=True) 
    title = models.CharField(max_length=100) 
    priority_id = models.IntegerField(blank=True, null=True) 
    created_date = models.DateTimeField(auto_now_add=True) 

    def due_date(self): 
     ... 
     return ageing 

我在尋找類似:

taskList = Task.objects.all().order_by('priority_id', ***duedate***, 'title') 

很顯然,你不能排序自定義函數一個查詢集。有任何建議嗎?

回答

2

由於實際的排序發生在數據庫中,它不會說Python,所以您不能使用Python函數進行排序。您將需要執行一個SQL表達式到期日的邏輯,作爲Queryset.extra(select={...})計算領域,東西線沿線的:

due_date_expr = '(implementation of your logic in SQL)' 
taskList = Task.objects.all().extra(select={'due_date': due_date_expr}).order_by('priority_id', 'due_date', 'title') 

如果你的邏輯過於複雜,則可能需要實現它作爲一個存儲過程在你的數據庫中。

另外,如果你的數據集是非常小的(比如說,幾十到幾百記錄),您可以獲取整個結果列表中的設置,並對其進行排序後的呈文:

taskList = list(Task.objects.all()) 
taskList.sort(cmp=comparison_function) // or .sort(key=key_function) 
+0

不錯的答案。所以它應該在SQL端或Python端處理。 – killua8p

0

如果查詢集不是太大,可以使用Python排序:

ordered = sorted(Task.objects.all(), key=lambda o: (o.priority_id, o.due_date(), o.title)) 
+0

感謝您的答案。但是這不會成爲order_by(duedate,title) - 沒有priority_id? – killua8p

+0

好點。我糾正了我的答案。 – arocks

相關問題