在django中组合order_by和distinct

时间:2013-01-04 17:35:14

标签: django postgresql sql-order-by distinct

大家好,

我读了很多关于它的内容,我可以理解这样的实现缺失了,但我无法理解为什么我不能用Django模拟SELECT的行为(SELECT DISTINCT [...] )订购。

我知道如果没有ORDER BY子句中的列,PostgreSQL就不支持DISTINCT ON。但是我可以通过在DISTINCT的子选择上执行ORDER BY来达到我想要的结果。我想在Django中做同样的事情,因为在这种情况下的性能没有问题。但Django QuerySets(太)懒惰。

我本来希望能够运行这个:

b = Backup.objects.filter(state__iexact='up').distinct('md5_checksum').order_by('-create_date', '-title')

或者至少这个:

b = Backup.objects.filter(state__iexact='up').distinct('md5_checksum')
if b.count() > 6:
    b = b.order_by('-create_date', '-title')

但遗憾的是,即使尝试通过count()调用强制执行第一个查询,它也会尝试在同一查询中执行distinct和order_by,这是失败的。

因此,基于this,我必须回到python排序来做同样的事情:

b = sorted(b, key=lambda x: (x.create_date, x.title), reverse=True)

如果有人有一个更优雅的解决方案,一种强制Django提交第一个SELECT DISTINCT的方法,我会很乐意拥有它。谢谢!

1 个答案:

答案 0 :(得分:1)

order_by方法中,您可以尝试添加'md5_checksum'作为第一个参数。这可能有助于它正确排序,除非我误解了这个问题。