1

こんにちは、みんな、

私はそれについてかなり読んで、そのような実装が欠落していることを理解できますが、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 を強制的にコミットさせる方法など、より洗練された解決策を誰かが持っていれば、私はそれを喜んで提供します。ありがとう !

4

1 に答える 1

1

メソッドでは、最初のパラメーターとしてorder_by追加してみてください。'md5_checksum'私が質問を誤解していない限り、それは正しく注文するのに役立つかもしれません.

于 2013-01-04T17:44:35.140 に答える