在Django queryset中的同一个表中按聚合排序

时间:2014-05-22 10:04:12

标签: python sql django django-queryset

我正在尝试根据同一个表上的聚合来订购Django查询集。

模型如下:

class Thing(models.Model):
    cpn = models.CharField(max_length=100)
    name = models.CharField(max_length=100)
    price = models.IntegerField(blank=True, null=True)

我想要的是根据cpn的最低价格订购生成的查询集。我可以使用内部联接在SQL中执行此操作,但无法弄清楚如何在Django中执行此操作。

示例:

# select * from thing;

 id | cpn |  name   |  price
----+-----+---------+----------
  3 | 1   | poihg   |       12
  5 | 2   | slkgh   |       11
  6 | 2   | zxcb    |       13
  7 | 3   | wertyui |        1
  8 | 3   | wegwbn  | <<NULL>>
  2 | 1   | lkhgf   | <<NULL>>
  4 | 2   | welkgh  |        9
  1 | 1   | ered    |        8

预期的排序是:

# select * from thing
  inner join
    (select cpn, min(price) as min_price from thing group by cpn) as t1
  on thing.cpn = t1.cpn
  order by
    min_price desc, t1.cpn, price is not null desc, price desc;

 id | cpn |  name   |  price   | cpn | min_price
----+-----+---------+----------+-----+-----------
  6 | 2   | zxcb    |       13 | 2   |         9
  5 | 2   | slkgh   |       11 | 2   |         9
  4 | 2   | welkgh  |        9 | 2   |         9
  3 | 1   | poihg   |       12 | 1   |         8
  1 | 1   | ered    |        8 | 1   |         8
  2 | 1   | lkhgf   | <<NULL>> | 1   |         8
  7 | 3   | wertyui |        1 | 3   |         1
  8 | 3   | wegwbn  | <<NULL>> | 3   |         1

我可以使用Thing.objects.raw,但我正在寻找使用常规查询集的解决方案,因为需要此排序的视图从其他地方获取查询集,并且生成的查询集将在表单中使用

后端数据库是PostgreSQL,我并不反对不可移植的解决方案。

ANSWER

史基林的评论让我走上正轨。通过使用外键,我可以得到我想要的订单。

0 个答案:

没有答案