如何在Django中按'status'变量排序对象
我想找到一种方法,把数据库里的订单按照它们的 status
状态来排序。这个应用是一个订单追踪的工具。每个订单都有一个状态,比如:'闲置'、'等待送货'、'准备取货'等等。我想把这些订单的列表显示出来,并且按照状态排序。现在我已经有一个可以用的筛选器,但我在想有没有办法把整个订单列表排序,让'闲置'的订单排在最上面,然后是'等待送货'的订单,依此类推。显然,我不能仅仅在 admin.py
文件里把 status
加到 ordering
中,因为那样会按照字母顺序排序状态。
有没有人知道简单的方法来解决这个问题?我觉得我可能想得太复杂了……
2 个回答
0
如果你想在SQL中进行排序,有两种方法可以做到这一点。
第一种方法是创建一个模型,把你的状态和数字值关联起来。
class status (Model.model):
status = Model.CharField()
sort_order = Model.IntegerField()
然后你可以把这个表和你的订单表连接起来,并按照排序顺序进行排序。
如果这样做对你来说不太实用,可以考虑使用自定义查询来帮你排序。你可以把这个查询附加到你的ORM方法中,使用.extra
方法。想了解更多信息,可以查看Django文档。
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
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)