2013-01-05 52 views
0

我需要通過兩個不同的因素排序Django管理更改列表視圖的查詢集:order_time和status。Django自定義查詢集按兩個字段排序

當對排序結果的查詢集進行排序時,應該通過減少order_time對列表底部的所有項目(item.status == 3)進行排序。本質上,我試圖將所有完成的訂單推送到列表的底部,而不管他們的order_time

這是模型的樣子:

def Order(models.Model); 
    order_time = models.DateTimeField(null=True) 
    status = models.PositiveSmallIntegerField(choices=ORDER_STATUS, default=ORDER_RECEIVED) 

我已經與查詢集與itertools.chain但因爲我這樣做了Django的改變列表視圖結合好惹的,我特別需要返回查詢集。

我可以爲此使用經理嗎?或者是他們執行自定義SQL的方式,相應地預先定製qs?

這裏的順序查詢集應該是什麼樣子的例子:

 
ORDER ORDER_TIME  STATUS 
    3   12/3   2 
    8   12/5   2 
    1   12/6   1 
    7   12/2   3 
    10  11/12   3 

回答

4

如何製作一個模型選擇。

def Status(models.Model): 
    # You could put in an 'id' or 'code' field to match up to your current status codes properly 
    value = models.CharField(max_length=20) 
    importance = models.IntegerField() 

然後改變你的模型:

class Order(models.Model); 
    order_time = models.DateTimeField(null=True) 
    status = models.ForeignKey('Status') 

    class Meta: 
     ordering = ('status__importance', 'order_time') 

創建狀態模式和根據需要設置的重要領域,在你的例子設定的狀態1 & 2重要性等於(例如5)並將狀態3的重要性設置爲「較重」(例如10)。這將按重要性分組排序,然後按時間排序,因此具有相同重要性的狀態將組合在一起。

0

模型include an ordering option,這將使類似的Meta選項:

class Order(models.Model); 
    order_time = models.DateTimeField(null=True) 
    status = models.PositiveSmallIntegerField(choices=ORDER_STATUS, default=ORDER_RECEIVED) 

    class Meta: 
     ordering = ('status', 'order_time') 
+0

謝謝,但我不知道這會幫助我。正如我理解訂購選項,這將導致我的訂單首先按狀態排序,然後按訂單時間排序。我需要的是按order_time對訂單進行排序,並且只將這些訂單附加到列表的底部,該訂單的'order_status'爲'completed' –

相關問題