【问题标题】:Django custom queryset sort by two fieldsDjango 自定义查询集按两个字段排序
【发布时间】:2012-12-20 01:55:00
【问题描述】:

我需要按两个不同的因素对 Django 管理员更改列表视图的查询集进行排序:order_time 和 status。

当排序时,结果查询集应该通过减少 order_time 来排序,所有在列表底部有 (item.status == 3) 的项目。本质上,我试图将所有已完成的订单推到列表的底部,而不管他们的order_time

这是模型的样子:

def Order(models.Model);
  order_time = models.DateTimeField(null=True)
  status = models.PositiveSmallIntegerField(choices=ORDER_STATUS, default=ORDER_RECEIVED)

我已经搞砸了将查询集与 itertools.chain 结合起来,但由于我正在为 django 更改列表视图执行此操作,因此我特别需要返回一个查询集。

我可以为此使用管理器吗?或者他们是一种执行自定义 SQL 的方法,可以相应地对 qs 进行预排序?

以下是订单查询集的示例:

ORDER ORDER_TIME 状态 3 12/3 2 8 月 12 日 5 日 2 1 12/6 1 7 月 12 日 2 日 3 2012 年 11 月 10 日 3

【问题讨论】:

    标签: django django-admin django-queryset


    【解决方案1】:

    如何为选择制作模型。

    def Status(models.Model):
        # You could put in an 'id' or 'code' field to match up to your current status codes properly
        value = models.CharField(max_length=20)
        importance = models.IntegerField()
    

    然后将您的模型更改为:

    class Order(models.Model);
        order_time = models.DateTimeField(null=True)
        status = models.ForeignKey('Status')
    
        class Meta:
            ordering = ('status__importance', 'order_time')
    

    创建您的状态模型并根据需要设置重要性字段,在您的示例中,将状态 1 和 2 的重要性设置为相等(例如 5),并将状态 3 的重要性设置为“较重”(例如 10)。这将按重要性分组顺序,然后是时间,因此具有相同重要性的状态将被分组在一起。

    【讨论】:

      【解决方案2】:

      模型include an ordering option 的元选项,它会给出如下内容:

      class Order(models.Model);
          order_time = models.DateTimeField(null=True)
          status = models.PositiveSmallIntegerField(choices=ORDER_STATUS, default=ORDER_RECEIVED)
      
          class Meta:
              ordering = ('status', 'order_time')
      

      【讨论】:

      • 谢谢,但我不确定这对我有帮助。据我了解订购选项,这将导致我的订单首先按状态排序,然后按订单时间排序。我需要的是按 order_time 对订单进行排序,并且只将那些订单附加到列表底部的 order_status completed
      猜你喜欢
      • 2020-08-16
      • 2010-12-11
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2018-01-25
      • 2017-07-30
      相关资源
      最近更新 更多