0

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

对结果查询集进行排序时,应通过减少 order_timeitem.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
4

2 回答 2

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

于 2013-01-06T00:23:20.240 回答
0

模型的元选项包括一个orderingoption,它会给出如下内容:

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')
于 2013-01-05T23:05:22.830 回答