2016-12-12 2 views
0

Djangoが実際にQuerySetメソッドからデータベースに当たっているときに印刷する方法が見つかりませんでしたが、ドキュメントによれば、以下の私の例は不必要に2つのクエリを実行するのでしょうか?DjangoはQuerySetがすでに評価されているかどうかチェックしますか?

queryset = MyModel.objects.all() 
#Slicing evaluates a query 
queryset = queryset[5:10] 
#Serializing should also evaluate a query 
data = serializers.serialize('json', queryset, fields=('pk', 'name')) 
+2

は、なぜそれが2つのクエリを実行する必要が評価操作ではありませんか?もちろん、クエリがすでに評価されている場合、Djangoはそれを再度評価する必要はありません。 –

+2

また、 'django.db.connection.queries'にアクセスすることで、Djangoがどのようなクエリを作成しているのかを表示することができます。[FAQ](https://docs.djangoproject.com/ja/1.10/faq/models/#how- raw-sql-queries-django-is-runningを見ることができます)、またはdjango-debug-toolbarを使用します。 –

+0

環境変数 'DJANGO_LOG_LEVEL = DEBUG'を設定してDjangoを実行してください! –

答えて

1

シリアライザは、関連分野に関するデータが含まれている場合、このコードは、複数のクエリを実行することを唯一の方法は、さらに、クエリは、関連するモデルの結果を取得するために行うことができ、その後になります。未評価のクエリセットをスライス

コメントでknbk

で述べたように、通常、別の未評価のクエリセットを返しますが、Djangoは、あなたが、スライス表記に「ステップ」パラメータを使用する場合は、データベースクエリを実行し、戻りますリスト。評価されたQuerySetをスライスすると、リストも返されます。

手順を使用していないので、スライスはクエリ

+2

_ "評価されていないQuerySetをスライスすると、評価されていない別のQuerySetが返されますが、Djangoはスライス構文の" step "パラメータを使用するとデータベースクエリを実行し、リストを返します。 "_([source](https://docs.djangoproject.com/ja/1.10/ref/models/querysets/#when-querysets-are-evaluated))。 「ステップ」なしで評価されていないクエリーセットをスライスしても評価されません。 OPの例では、(スライスされた)クエリーセットをシリアル化するだけで評価されます。 – knbk

+0

@knbk - オハイオ州のおかげで、私はスライス(または忘れてしまった)の部分を誤読しました。悪いですが、この回答を削除してください。 – Sayse

関連する問題