如何在Django中按'status'变量排序对象

2 投票
2 回答
1263 浏览
提问于 2025-04-18 04:10

我想找到一种方法,把数据库里的订单按照它们的 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)

撰写回答