大家好,
我读了很多关于它的内容,我可以理解缺少这样的实现,但我不明白为什么我不能用 Django 模拟 SELECT (SELECT DISTINCT[...]) ORDER BY 的行为.
我知道如果没有 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,但失败了。
因此,基于此,我必须回到 python 排序来做同样的事情:
b = sorted(b, key=lambda x: (x.create_date, x.title), reverse=True)
如果有人有更优雅的解决方案,一种强制 Django 提交第一个 SELECT DISTINCT 的方法,我会很高兴拥有它。谢谢 !