2009-07-06 9 views
4

Djangoのようなフレームワークでどのようにレイジーローディングが達成されているかを知ることに興味があります。参加を行う決定はいつ行われますか?そして、Djangoに熱心な読み込みを強制する方法はありますか?あなたがDjangoに熱心な負荷を強いる必要がある時がありますか?Django(および他のMVC/ORM)のレイジーローディング関係

答えて

11

一般的な答えは、実際にいくつかのレコードを求めるときにDjangoがクエリを実行するという決定を下すことです。最も一般的には、これはクエリーセット(for record in queryset:)を反復するか、クエリーセットをリストに変換する組み込み関数list()を使用することを意味します。

公式ドキュメントの詳細については、When QuerySets are evaluatedを参照してください。

それは__repr____getitem____iter__などの特別な方法が正しいことを行うためにコード化されているdjango/db/models/query.py、中QuerySetというクラスを定義することによってこれを実現します。

あなただけのように、クエリセットに内蔵されたPythonのリスト機能を実行する積極的なロードを強制する必要がある場合:

qs = SomeModel.objects.all() 
ql = list(qs) 

list()へのこの呼び出しは、DBクエリを実行し、メモリにすべてのオブジェクトをロードします。あなたがこれを行う必要があるのは非常にまれですが、テンプレートの複数の場所でクエリ結果を使用する必要があるケースもあります。リストに変換してテンプレートコンテキストでリストを渡すと、繰り返すテンプレート内のすべての場所で1回ではなく、1回だけクエリが実行されます。

関連する問題