2016-11-15 6 views
5

私は手作業でDjangoクエリーセットを作成しています.Django ORMを使用して、結果として得られるquerset.query SQL自体を自分のDBに当てるのではなく読みたいと思っています。私はちょうど私のコードでは、純粋なクエリセットを構築していることを確認したいDjango QuerySetが評価されているかどうかを確認するにはどうすればよいですか?

https://docs.djangoproject.com/en/1.10/ref/models/querysets/#when-querysets-are-evaluated

しかし...何場合:

私は、Djangoのquersetsは怠け者だと私は評価されているクエリセットをトリガーするすべてのOPSを参照してください知っています私のDBをまだ誤って評価し打つことはありませんか?クエリーセットオブジェクトに、実際に評価せずに評価されていないことを確認するための属性がありますか?基本的なフィルタのように、モデルインスタンスのリストを返すか、除外する selectを使用してクエリセット用

+0

私はそうは思わない、そのような使用例は必要ないと思う。なぜあなたはそのような機能が必要ですか? –

+0

私は、Django ORMが実際にそれを実際に評価するよりも、SQL用に他の用途を持っています。 – slumtrimpet

答えて

5

それが持っている場合はクエリセットは評価され、または結果のリストされていない場合、_result_cache属性がNoneです。非公開属性に関する通常の警告が適用されます。

他のクエリーセット(カウント、削除など)については、単純な方法があるかどうかはわかりません。たぶん、あなたのデータベースのログを見たり、DEBUGモードで実行し、ここで説明したようconnection.queriesをチェックしてください。それは、彼らがを反復をスライスしているときです:QuerySet Sが評価されるときを知りたい人のために https://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running

+0

完璧、ありがとう。 – slumtrimpet

+0

@slumtrimpet - レコードを取得するのに 'SELECT' SQLを使用するクエリでは機能しますが、必ずしもすべてのクエリで機能するとは限りません。 –

1

漬けまたはキャッシュさのrepr() D 'LEN()' は、リストをD()「EDまたはBOOL() '。 https://docs.djangoproject.com/en/1.10/ref/models/querysets/#when-querysets-are-evaluated

+2

これはOPが質問に出したリンクです。質問は「いつDjangoがquerysetを評価するか」ではなく、質問は「querysetオブジェクトが与えられていると、評価済みかどうかをどのようにして知ることができるのか」という問題です。これらの操作中に '_result_cache'がどのように変化するのかを知るには、ソースコードを参照してください:https://github.com/django/django/blob/master/django/db/models/query.py –

+0

@PeterDeGlopperああ、そうです申し訳ありませんが、あなたは完全に正しいです。私は、Djangoがいつそれを評価するかを知りたい人に情報を提供するように答えを編集します。 – feakuru

関連する問題