2017-11-10 13 views
1

次のコードはquestion.nameを呼び出すたびにデータベースにクエリを実行しますか?オブジェクトの属性にアクセスすると、Djangoはデータベースにアクセスしますか?

class Question(models.Model): 
    name=models.CharField() 
    test=models.ForeignKey(Test) 

questions = Question.objects.filter(test=some_test) 
for question in questions: 
    question_name = question.name 

私の見解では、一連の質問とユーザーからの回答とワークシートの採点があります。私の目標は、データベースに戻らずにすべての得点を実行してから、私の比較結果(辞書)をバックグラウンドタスクを使って保存することです。私は不要なデータベースのヒットを取り除きたい。

+0

これは本当に良い質問です。よくやった!私の意見では、より多くのトラフィックを生成しているはずです。 – scharette

答えて

-1

あなたの質問は不明ですが、確かに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を使用して、ブール値のコンテキストでクエリセットをテストするには、だから、

を実行します。イテレーションはデータベースにヒットをもたらします。

+0

ありがとう、私は編集しました。それはもう少し明確になりますか?あなたは私の質問に答えました。したがって 'Question'のインスタンス上で' question.name'を呼び出すことは、すでに検索した質問にはその行のすべての情報が含まれているため、別のデータベースヒットにはなりません。 –

+0

さて、あなたは上記のコードを試すことができますが、クエリーセットのインスタンスが返されるため、それがうまくいくとは思えません。あなたのように反復することはできません。投稿したようなコードは動作していますか? – scharette

+0

私はいつもそのような質問セットを繰り返します! –

関連する問題