5

ここに私のスキーマがあります:

都市 --> カメラマン

少なくとも 1 人の写真家がいる都市のリストを取得し、その都市の写真家の数を返そうとしています。

ここに私が取り組んでいるクエリセットがあります:

City.objects.annotate(photographer_count=aggregates.Count('photographers')).filter(photographer_count__gt=0).order_by('-photographer_count')

これは、Django が左外部結合を使用して都市/写真家の間の結合を行うことを選択した理由を除いて、私が期待したとおりに機能します。SQL テキストを取得し、単に「左外側」を「内側」に変更すると、クエリは 11 秒から 200 ミリ秒になり、同じ結果が得られます。

注釈の前にフィルターを配置して、内部結合であることを Django に示唆しようとしましたが、うまくいきませんでした。

その内部結合を取得するためにこれで実行できるDjangoクエリブードゥーはありますか? そのままの SQL を使用できることはわかっていますが、ORM を使用したいと考えています。

4

2 に答える 2

0

通常、Django が実行するクエリと結合をこのレベルで制御することはできません。

Django は、フィルタ条件がこの時点で INNER JOIN を回避できることを意味することに気付くなど、本当に賢いことはしません。一般的なケースで正しいクエリを生成する必要があります。この場合、LEFT OUTER JOIN を意味します。私が知る限り。

したがって、おそらく生の SQL が必要になるでしょう。

于 2012-07-23T23:52:56.247 に答える