如何通过Django中的'status'变量对对象进行排序

时间:2014-04-25 02:06:54

标签: python django django-queryset

我试图找到一种方法来显示基于其status变量的订单中的数据库对象列表。该应用程序是一个订单跟踪应用程序每个订单都有一个状态:'空闲','等待交货','准备好提货'等。我想显示订单列表,按其状态排序。我已经有一个正在运行的过滤器,但我想知道是否有办法对整个订单列表进行排序,以便“空闲”订单位于顶部,然后是“等待交付”订单,依此类推。显然,我不能在status文件中将ordering添加到admin.py,因为这会按字母顺序对状态进行排序。

有人知道解决此问题的简单方法吗?我确定我只是在考虑这件事......

2 个答案:

答案 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)

答案 1 :(得分: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