Djangoアプリケーションをテストする際に、特定のフィルタ()が使用されたときに特定のクエリでパフォーマンスの問題が発生しました。問題は解決しましたが、私は理由を理解していません。Django filter()は減らすのではなく結果のQuerySetを増加させます
私は3つの基準に基づいてクエリセットをフィルタリングしています。一度にすべてを含めると、期待される結果が得られます。いずれかの句を独自のfilter()呼び出しに移動すると、結果として得られるQuerySetは、はるかに大きく、一見重複した項目で埋められます。
この説明は以下を参照してください。 result__is_false=False
句を独自のfilter()に移動すると、結果のQuerySetが大幅に拡張されます。
>>> Finding.objects.filter(project=1, result__scan_session__is_enabled=True,\
result__is_false=False).count()
3566
>>> Finding.objects.filter(project=1, result__scan_session__is_enabled=True)\
.filter(result__is_false=False).count()
10050380
問題は、条件付きで問題になっているフィルタを適用する必要があり、毎回ではありませんでした。トリックを行っているように見えた
>>> Finding.objects.filter(project=1, result__scan_session__is_enabled=True)\
.exclude(result__is_false=True).count()
3566
:私はこのような除外()ルーチンにフィルタ()ルーチンを変換することによって、問題を解決しました! 、
1)フィルタ()およびexclude()を説明する記事は、彼らが反対で大きさが等しいとして扱うことができることを示唆しているように見える理由:私はこれが働いたことを幸せに思いますが
は、私は2つのことを理解していません上記の例に基づいて、必ずしもそうとは限りません。
2)なぜresult__is_false=False
句を独自のフィルタ()に移動すると、最初の結果で大きなジャンプが発生しました。
誰にもこれらのいずれかの洞察がありますか?
'print(Finding.objects.filter(...)。query)'でクエリを出力し、すべてが返信されます – wim
2番目の部分(問題の内容を説明する)は、おそらく回答として投稿する必要があります。 – EJoshuaS