【问题标题】:How to order objects by a 'status' variable in Django如何通过 Django 中的“状态”变量对对象进行排序
【发布时间】:2014-06-10 13:43:40
【问题描述】:

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

有人知道解决此问题的简单方法吗?我敢肯定我只是在想这整件事..

【问题讨论】:

    标签: python django django-queryset


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      如果你想在 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
      

      【讨论】:

      • 我曾考虑过使用您提到的索引作为您的第一点。但是,除非绝对必要,否则我不想在我的数据库中添加任何内容。我也没有真正遵循你提到的第二种方法,因为我对 Python/Django 还是很陌生。
      • 试试吧。它不会伤害 ;-)
      猜你喜欢
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      相关资源
      最近更新 更多