Django自定义查询集按两个字段排序

时间:2013-01-05 22:49:59

标签: django django-admin django-queryset

我需要通过两个不同的因素为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更改列表视图执行此操作,所以我特别需要返回一个查询集。

我可以利用经理吗?或者他们是一种执行相应预订qs的自定义SQL的方法吗?

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

ORDER    ORDER_TIME      STATUS
  3         12/3           2
  8         12/5           2
  1         12/6           1
  7         12/2           3
  10        11/12          3 

2 个答案:

答案 0 :(得分:4)

如何为选择制作模型。

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和1的重要性。 2等于(例如5)并将状态3的重要性设置为“更重”(例如10)。这将按重要性和时间对顺序进行分组,因此具有相同重要性的状态将组合在一起。

答案 1 :(得分:0)

模型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')