こんにちは、みんな、
私はそれについてかなり読んで、そのような実装が欠落していることを理解できますが、Django で SELECT (SELECT DISTINCT[...]) ORDER BY の動作をエミュレートできない理由がわかりません.
私は、PostgreSQL が ORDER BY 句に列を持たない DISTINCT ON をサポートしていないことを知っています。しかし、DISTINCT のサブセレクトで ORDER BY を実行することで、必要な結果に到達できます。この場合のパフォーマンスは問題ないので、Djangoでも同じことをしたいと思います。しかし、Django QuerySet は (あまりにも) 怠惰です。
これを実行できればよかったのに:
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() 呼び出しを介して最初のクエリを強制的に実行しようとしても、同じクエリで個別のクエリと order_by を実行しようとしますが、これは失敗しています。
したがって、これに基づいて、Python の並べ替えに戻って同じことを行う必要があります。
b = sorted(b, key=lambda x: (x.create_date, x.title), reverse=True)
Django に最初の SELECT DISTINCT を強制的にコミットさせる方法など、より洗練された解決策を誰かが持っていれば、私はそれを喜んで提供します。ありがとう !