2014-04-25 34 views
2

我想找到一種方法來顯示基於status變量的順序中的數據庫對象列表。該應用程序是一個訂單跟蹤應用程序每個訂單都有一個狀態:'空閒','等待交貨','準備取貨'等。我想要顯示訂單列表,按其狀態排序。我已經有一個正在工作的過濾器,但是我想知道是否有辦法對整個訂單列表進行排序,以使'空閒'訂單處於頂部,然後是'等待交貨'訂單,等等。顯然,我不能只在admin.py文件中將status添加到ordering,因爲它按字母順序排列狀態。如何通過Django中的'status'變量來排序對象

有沒有人知道一個簡單的方法來解決這個問題?我敢肯定,我只是在想這件事。

回答

0

如果你想在SQL中排序有兩種方法來實現這一點。

創建了一個模型,用數值鏈接你的狀態

class status (Model.model): 
    status = Model.CharField() 
    sort_order = Model.IntegerField() 

您可以通過SORT_ORDER

加入此表與您的訂單表和訂單。如果你考慮一個自定義查詢,這似乎不實用的爲你訂購。你可以用.extra方法將它附加到你的orm方法中。看到django documentation

Order By Case 
      When status_order Like 'idle Then 1 
      When status_order Like 'awaiting delivery' Then 2 
      When status_order Like 'ready for pickup' Then 3 
      Else 99 
      End Asc 
+0

我曾考慮過使用像你提到的索引作爲第一點。但是,除非絕對必要,否則我不想向數據庫添加任何內容。我也沒有真正遵循你提到的第二種方法,因爲我對Python/Django還很陌生。 – nblakey

+0

好吧,試試吧。它不會傷害;-) –

1

所有我落得這樣做添加一個字母到每個狀態的名字更多的相關信息。由於我對每種狀態都有一個很好的,整潔的名字,我不認爲它太多影響可讀性。我不能說這是世界上最好的解決方案,但我相信這是最簡單的。

STATUS_OF_ORDER = (
    ('A_IDLE', 'Not yet ordered'), 
    ('B_SHIP', 'Awaiting delivery'), 
    ('C_PICK', 'Ready for pickup'), 
    ('E_UNAV', 'Unavailable for order'), 
    ('D_BACK', 'Backordered - awaiting delivery'), 
    ('F_CANC', 'Canceled by customer'), 
    ('G_ARCH', 'Fulfilled'), 
    ) 
    status = models.CharField(max_length=6, choices=STATUS_OF_ORDER, 
          default='A_IDLE', editable=False) 
相關問題