Django などのフレームワークで遅延読み込みがどのように実現されるかを知りたい。結合を実行する決定はいつ行われますか? そして、Django で熱心な読み込みを強制する方法はありますか? Django にイーガー ロードを強制する必要がある場合はありますか?
1 に答える
一般的な答えは、実際にいくつかのレコードを要求したときに、Djangoがクエリを実行することを決定するというものです。for record in queryset:
最も一般的には、これはクエリセット( )を反復処理するか、list()
組み込み関数を使用してクエリセットをリストに変換することを意味します。
公式ドキュメントの詳細については、 QuerySetsが評価される時期を参照してください。
これは、で呼び出されるクラスを定義することで実現されQuerySet
ますdjango/db/models/query.py
。ここで、のような特別なメソッドは、正しいことを行うようにコーディングされています__repr__
。__getitem__
__iter__
積極的な読み込みを強制する必要がある場合は、クエリセットで組み込みのPythonリスト関数を実行するだけです。
qs = SomeModel.objects.all()
ql = list(qs)
この呼び出しlist()
は、DBクエリを実行し、すべてのオブジェクトをメモリにロードします。これを行う必要があることは非常にまれですが、1つのケースは、テンプレート内の複数の場所でクエリ結果を使用する必要がある場合です。リストに変換してテンプレートコンテキストでリストを渡すと、反復するテンプレート内のすべての場所に対して1回ではなく、1回だけクエリが実行されます。