2012-05-11 13 views
16

here Djangoクエリーセットが遅延していると、実際に印刷されるまで評価されません。私は、ジャンゴの組み込みページネーションを使って簡単なページ設定をしました。私は "django-pagination"やその仕事をする "django-endless"のようなアプリがすでに存在していたことに気付かなかった。Django遅延クエリーセットとページ番号

はとにかく私はクエリセットは、私は例えば、この

entries = Entry.objects.filter(...) 
paginator = Paginator(entries, 10) 
output = paginator.page(page) 
return HttpResponse(output) 

を行うときにはまだ怠惰されており、この部分は、私は現在、私が見たいものは何でもページを取得するたびに呼ばれているかどうかを疑問に思います。

私はデータベースに不必要な負荷をかけたくないので、私は知っておく必要があります。

答えて

32

に評価を開始することを意味:

>>> paginator = Paginator(queryset, 10) 
>>> print connection.queries 
[] 

まだありません。

>>> page = paginator.page(4) 
>>> page 
<Page 4 of 788> 
>>> print connection.queries 
[{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}] 

このページを作成すると、クエリセット内のエントリ数をカウントする1つのクエリが生成されています。エントリはまだフェッチされていません。

は、変数「オブジェクト」にページのオブジェクトを割り当てます。

>>> objects = page.object_list 
>>> print connection.queries 
[{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}] 

これはまだエントリがフェッチさせていません。

エントリがフェッチされている、最後に

>>> response = HttpResponse(page.object_list) 
>>> print connection.queries 
[{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}, {'time': '0.011', 'sql': 'SELECT `entry`.`id`, <snip> FROM `entry` LIMIT 10 OFFSET 30'}] 

オブジェクトリストからHttpResponseを生成します。

+3

驚くばかりです。私はdjangoが問い合わせが行われたかどうかを調べるツールを持っていることは知らなかった。 – starcorn

+3

@starcorn [django-debug-toolbar](https://github.com/django-debug-toolbar/django-debug-toolbar)を見てください – DrTyrsa

+0

デバッグツールバーは、すべてのDjango開発者が使用すべきツールです。非常に便利です。 – rectangletangle

3

です。 Djangoのページネーションはクエリーセットに適用されるのと同じルール/最適化を使用します。

これは、それはあなたが発生している場所を確認したい場合は、インポートdjango.db.connectionqueries

>>> from django.db import connection 
>>> from django.core.paginator import Paginator 
>>> queryset = Entry.objects.all() 

を調べるにはページネータを作成し、任意のクエリが発生したかどうかを確認できますreturn HttpResponse(output)