在Django和PostgreSQL上使用order by和distinct进行编程错误

时间:2016-01-05 21:37:23

标签: python django postgresql

有很多类似的帖子,但没有一个完全符合我想要达到的目标。我明白必须使用与order_by相同的字段,这很好。

所以我有以下问题:

q = MyModel.objects.order_by('field1', 'field2', '-tstamp').distinct('field1', 'field2')

最终,我正在尝试在表格中找到field1field2的所有组合的最新条目。 order_by做了我认为应该做的事情,这很棒。但是当我执行distinct时,我收到以下错误。

ProgrammingError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions

最终这似乎是一个SQL问题(不是Django问题)。然而,看着django docs的不同之处,它显示了能够和不能工作的东西。它的确如此

q = MyModel.objects.order_by('field1', 'field2', '-tstamp').distinct('field1')

将起作用(......确实如此)。但我不明白,当我按照field2中的相同顺序添加order_by时,我仍会得到相同的结果。任何帮助将不胜感激

编辑:我还注意到,如果我这样做

q = MyModel.objects.order_by('field1', 'field2', '-tstamp').distinct('field1', 'field2', 'tstamp') # with or without the - in the order_by

它仍会引发同样的错误,尽管文档表明这应该可以正常工作

2 个答案:

答案 0 :(得分:0)

能够通过在order_by()中使用pk来正常运行查询

q = MyModel.objects.order_by('field1__pk', 'field2__pk', '-tstamp').distinct('field1__pk', 'field2__pk')

显然,当他们不是普通类型时,orderby不会发挥超级好看。但是,使用对象的pk似乎可以正常工作

答案 1 :(得分:0)

测试一下:

q = MyModel.objects.order_by('field1__id', 'field2__id', '-tstamp').distinct('field1__id', 'field2__id')