私は共通のクエリーセットをキャッシュしました。これは、状況に応じて異なるフィールドに基づいてフィルタリングしたいと思います。私は最初の場所でそれをキャッシュする利点を失う場合、評価されたクエリセットをフィルタリングすることによって疑問に思っています。 Djangoは、キャッシュされたクエリーセットの作成に関連するクエリーセットとそれ以降に適用するフィルタの集まりである別のクエリーセットを最初から作成しますか?Djangoは評価されたクエリーセットをフィルタリングする方法を教えてください。
3
A
答えて
5
はい、結果はスローされます。
ソースからこれを見ることができます:filter()
_filter_or_exclude()
が呼び出され、_clone()
がコールされ、そのクエリに追加されます。 _clone
、あなたは見ることができる、_result_cache
属性を設定しません。
一般的に、共通の結果を維持するために可能性があることは明らかではありません。小さな結果セットを持つ複雑なクエリの場合、主キーが見つかった結果の1つであることを確認するSQLを発行するだけで置き換えることができますが、これは常に効率的になるとは限らず、場合によっては(データベースがキャッシュされてから追加のフィルタを実行するまでの間にクエリの結果に影響を与えるように変更された場合)意味がわかりにくくなります。
手動でIDを保存するこの動作を強制したい場合は、あなたがそれを行うことができます。
pks = SomeObject.objects.filter(...).values_list('pk', flat=True)
some_of_them = SomeObject.objects.filter(pk_in=pks).filter(...)
others = SomeObject.objects.filter(pk_in=pks).filter(...)
あなたはまた、もちろん、単に、例えば、Pythonでフィルタリングを行うことができますこれらまたはクエリを再発行の1のサイズに多くを依存しているかどうか
common = SomeObject.objects.filter(...)
some_of_them = [m for m in common if m.attribute == 'foo']
others = [m for m in common if m.other_attribute == 'bar']
(また、あなたは望ましい場合filter(lambda m: m.attribute == 'foo', common)
を使用するか、より明確であることをlist
にcommon
の定義をラップすることができます。)
によってフィルタの複雑さ、およびどのようなインデックスが存在しているかを示します。
関連する問題
- 1. appstoreの評価やレビューについて教えてください。
- 2. if条件でカスタム例外オブジェクトをfalseに評価する方法を教えてください。
- 3. TSQL UNPIVOTから値をフィルタリングする方法を教えてください。
- 4. Firebaseデータベースからデータをフィルタリングする方法を教えてください。
- 5. djangoはラジオボタンをレンダリングする方法を教えてください。
- 6. フィルタリングされたレコードを同じビューにレンダリングする方法を教えてください。
- 7. これを解決する方法...教えてください
- 8. Amazon Product API - 価格で販売する方法を教えてください。
- 9. ネストされたハッシュでグループ化する方法を教えてください。
- 10. @スケジュールされたタスクが終了する方法を教えてください。
- 11. Djangoで関数を再定義する方法を教えてください。
- 12. Djangoを常にメモリにロードする方法を教えてください。
- 13. Swingアプリケーションに触れる方法を教えてください。
- 14. Confluenceのwiki、コミュニティ、およびQ&A機能の評価方法を教えてください。
- 15. ポイントから消える方法を教えてください。
- 16. djangoに使用するdbテンプレートを教えてください
- 17. タブローを定義する方法を教えてください
- 18. ストリームフィルタをエコーする方法を教えてください。
- 19. オブジェクトをガベージコレクションする方法を教えてください。
- 20. ForeignKeyをモデル化する方法を教えてください。
- 21. Android - アイコンをタッチする方法を教えてください。
- 22. Eclipseプラグインをアンパックする方法を教えてください。
- 23. ImageViewCellをクリックする方法を教えてください。
- 24. Androidアプリをフリーズする方法を教えてください。
- 25. Edge.Funcを固定する方法を教えてください。
- 26. ImageView Androidをトリミングする方法を教えてください。
- 27. UIWindowをキーウィンドウにする方法を教えてください。
- 28. ジェンキンズを「ピップインストール」する方法を教えてください。
- 29. メソッドをオーバーライドする方法を教えてください。
- 30. IEに適したカスタマイズ方法を教えてください。