クエリセットに対して実行し、後で関連テーブルのフィールドで実行しprefetch_related('toppings')
たい場合、Django はキャッシュされた情報を無視してデータベース クエリを実行します。filter(spicy=True)
これは(メモボックスの下に)文書化されており、別の実行時にすべての形式のキャッシング(select_related()
、すでに評価されたクエリセットなど)で発生するようfilter()
です。
ただし、(リスト/辞書内包表記などを使用して) クエリセットをループするための Python コードを記述する必要なく、(キャッシュを使用し、データベースにヒットしないで) ローカルでフィルター処理するための、ある種の超秘密の隠された時間節約のショートカットはありますか? 多分何かのようなfilter_locally(spicy=True)
?
編集:
リスト/内包表記がうまく機能しない理由の 1 つは、リスト/辞書にクエリセット メソッドがないためです。私の場合、第 1 レベルの M2M フィールドtoppings
は最終目標ではなく、関連する第 2 の M2M フィールドを確認する必要があります (これも既にプリフェッチしています)。これはリスト内包表記を使用しても可能ですが、次のようなfilter_locally(spicy=True, origin__country='Spain')
理由がある方がはるかに簡単です。
- 最小限の労力で多くのレベルの関連フィールドにアクセスできます
- 他のクエリセットメソッドを連鎖させることができます
- おなじみのものと一貫しているため、読みやすくなっています。
filter()
- プリフェッチなしを使用して既存のコードを変更
filter()
し、大きな変更を加えることなくこの最適化を追加する方が簡単です。
しかし、応答から、Djangoにはそのようなサポートはありません:(