我正在尝试根据同一个表上的聚合来订购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
史基林的评论让我走上正轨。通过使用外键,我可以得到我想要的订单。