あなたの質問は不明ですが、確かに1つのことは、少なくともデータベースに1回のヒットが必要になることです。確かに、あなたのコードでは、あなたの使用してサンプル:
question_name = question.name
しかしquestion
は、事前にQuestion
モデルのインスタンスではない場合、私は、この作業は表示されません。
したがって、データベースにアクセスすることなく、question_name
を頻繁に再利用することができます。これは、データベース内の行の静的インスタンスとして参照してください。
EDIT
は、今すぐあなたの編集のために、それは同じ動作ではありません。背後で何が起こるのかを正確に理解するには、「怠惰」の概念を理解する必要があります。実際、クエリーセットはDjangoで怠け者なので、この行は
questions = Question.objects.filter(test=some_test)
となり、データベースにヒットすることはありません。クエリセットはSQLクエリのセットを表します。だから、現時点では、データベースから何かを取得するよう依頼していないので、実際にはまだ評価されていません。これは、必要なときにのみデータベースにアクセスするため、望ましい動作です。
反復
Aクエリセットは反復可能であり、それは、そのデータベースのクエリあなたはそれを反復最初 時間を実行します:documentationはここに言うようにクエリセットが評価されているケースがあります。未評価のクエリセットは通常、別の未評価の クエリセットを返しますが、Djangoはあなたがスライス構文の 「ステップ」パラメータを使用する場合は、データベースクエリを実行し、そして意志ますがスライス
をスライス
リストを返す。 Slicing a 評価されたQuerySetもリストを返します。
酸洗/キャッシュ
のrepr()。 QuerySetは、repr()を呼び出すと評価されます。これはPythonのインタラクティブなインタプリタの便宜のために です。したがって、対話的にAPIを使用する場合は の結果をすぐに確認することができます。
len()。 QuerySetは、len()を呼び出すと評価されます。これは、 のように、結果リストの長さを返します。
list()。リスト()を呼び出してQuerySetを強制的に評価する
bool()。あなたは状況1があなたの特定のケースに適用されます見ることができるようなステートメントは、クエリの原因となります場合はブール値()、 か、およびまたはANを使用して、ブール値のコンテキストでクエリセットをテストするには、だから、
を実行します。イテレーションはデータベースにヒットをもたらします。
これは本当に良い質問です。よくやった!私の意見では、より多くのトラフィックを生成しているはずです。 – scharette