2016-05-02 7 views
0

が、私は2つの単純なDjangoのモデルを持っている必要がありました。は、トラブルシューティングが

queryset = PhotoStream.objects.order_by('-creation_time').prefetch_related('photo_set') 
for obj in queryset: 
    print obj.photo_set.all() 
#print connection.queries 

は、デバッグツールバー経由で確認する、私は私場合は、上記のはまさにそれがクエリの同じ数を行っているでしょうないことが判明しました:私は、フォトストリームのクエリセットを形成する際に、すべての関連する写真を先取りするには、次のようにしようとしていますステートメントのprefetch_related部分を削除します。それは明らかに機能していません。私もprefetch_related('cover')を試してみました - どちらもうまくいきません。

私が間違っていることを誰かが指摘することはできますか?私の目標は、クエリーセット内のフォトストリームごとに関連するすべての写真を取得することです。どうすればこれを行うことができますか?


印刷connection.queries forループを実行した後に他のものの間で、含まれています

SELECT ("links_photo_which_stream"."photostream_id") AS "_prefetch_related_val", "links_photo"."id", "links_photo"."owner_id", "links_photo"."image_file" FROM "links_photo" INNER JOIN "links_photo_which_stream" ON ("links_photo"."id" = "links_photo_which_stream"."photo_id") WHERE "links_photo_which_stream"."photostream_id" IN (1)

注:私は私のモデルが質問に投稿された簡略化されてきた、それゆえクエリは上記ません出力に実際に表示されるいくつかのフィールドを含みますが、この質問とは無関係です。ここ

+0

生成されているクエリを投稿できますか? – solarissmoke

+0

@solarissmoke: –

+0

ありがとうございました。各写真が個別に取得されている他のクエリを見ることができますか? – solarissmoke

答えて

0

prefetch_relatedからの抽出物の一部である:

**prefetch_related**、一方、各関係のために別々のルックアップを行い、そしてPythonで‘joining’を行います。

そして、いくつかのより:

>>> Pizza.objects.all().prefetch_related('toppings') 

これは、それぞれのピザのためself.toppings.all()を意味します。今度はself.toppings.all()が呼び出されるたびに、アイテムのデータベースに移動する代わりに、プリフェッチされたクエリセットキャッシュが1つのクエリで取り込まれています。

だから、あなたが見るクエリの数は常に同じであることがありますが、各photostreamは、それがすでに構築prefetched QuerySet cacheをヒットするためにデータベースを打つのではなく、その後prefetch_relatedを使用している場合、そこからphoto_setを取得します。

+0

ここで何を意味するのか分かりません。両方のケースでクエリを実行している間に取った合計時間を測定できますが、重要なデータが必要です。 'prefetch_related'があなたのためにすることは、データベース自体へのラウンドトリップを保存することです。 – AKS

+0

私は、具体的には、DBへのラウンドトリップが実際に保存されていることを客観的に測定する任意の方法を意味します(説明したように、SQLクエリのカウントは変更されないため)。私は実際にどのように実装したのか分かりますか? –

+1

あなたは質問自体を見ることができます(あなたの質問に投稿すると同時に)。質問には 'prefetch_related_val'のようなものがあります。 – AKS

関連する問題