我有两个模型,Track
和 Pair
。每个Pair
都有一个track1
、track2
和popularity
。我正在尝试按对的受欢迎程度(降序)获取有序列表,没有两对具有相同的 track1
。到目前为止,这是我尝试过的:
lstPairs = Pair.objects.order_by('-popularity','track1__id').distinct('track1__id')[:iNumPairs].values_list('track1__id', 'track2__id', 'popularity')
这给了我以下错误:
ProgrammingError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
...所以我尝试了这个:
lstPairs = Pair.objects.order_by('-popularity','track1__id').distinct('popularity', 'track1__id')[:iNumPairs].values_list('track1__id', 'track2__id', 'popularity')
这为我提供了具有重复 track1__id
的条目。有谁知道解决这个问题的方法?我猜我将不得不使用 raw()
或类似的东西,但我不知道我将如何处理这样的问题。我将 PostgreSQL 用于数据库后端,因此应该支持 DISTINCT
。
最佳答案
首先,让我们澄清一下:DISTINCT
是标准 SQL,而 DISTINCT ON
是 PostgreSQL 扩展。
错误(DISTINCT ON expressions must match initial ORDER BY expressions
)表明,你应该修复你的ORDER BY
子句,而不是DISTINT ON
(如果你这样做,你最终会得到不同的结果,就像你已经体验过的那样)。
The
DISTINCT ON
expression(s) must match the leftmost ORDER BY expression(s). The ORDER BY clause will normally contain additional expression(s) that determine the desired precedence of rows within each DISTINCT ON group.
这会给你预期的结果:
lstPairs = Pair.objects.order_by('track1__id','-popularity').distinct('track1__id')[:iNumPairs].values_list('track1__id', 'track2__id', 'popularity')
在 SQL 中:
SELECT DISTINCT ON (track1__id) track1__id, track2__id, popularity
FROM pairs
ORDER BY track1__id, popularity DESC
但可能顺序错误。
如果你想要原来的订单,你可以在这里使用子查询:
SELECT *
FROM (
SELECT DISTINCT ON (track1__id) track1__id, track2__id, popularity
FROM pairs
ORDER BY track1__id
-- LIMIT here, if necessary
)
ORDER BY popularity DESC, track1__id
关于python - Django:在外键上不同,然后排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25646513/