2010-11-30 14 views
0

DjangoとPythonが初めてのので、まずQuerySetからすべてのレコードを取得せずにページングを実行する方法を理解しようとしています。 QuerySetsで見たすべての例は、まず以下のようにすべてのレコードを取得します。スライス付きのDjangoページング

tickets = Ticket.objects.filter(site=site.id)  
paginator = Paginator(tickets, settings.PAGE_SIZE) 

これは、ページャーに必要なページ数を参照するように意味があるようです。しかし、これは、各ページ要求に対してすべてのレコードを取得することは効率的ではないようです。 QuerySetsをスライスして一連のレコードを返すことができます。

ページングを設計してそのページ(スライシング?)に関連するレコードを取得するだけですが、まだページング機能はありますか?

編集:反復するテンプレートコードが追加されました。

{% for ticket in tickets.object_list %} 
     {{ ticket }}<br/> 
    {% endfor %} 

答えて

1

QuerySetオブジェクトの基礎となるクエリは、明示的に評価するまで実行されません。明示的な評価は、反復処理を行うたびに発生し、str()またはunicode()を呼び出します。

このように、上記のコードスニペットは確かに効率的です。 tickets = Ticket.objects.filter(site=site.id)行は新しいQuerySetを作成しますが、クエリはまだ評価されていません。

同じ理由で、Model.objects.filter(foo).filter(bar).order_by(baz)...のようなものは、単一のSQLクエリを実行しません。

+0

参考までに、クエリーセットの実行タイミングについてはhttp://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluatedを参照してください。 –

+0

応答をありがとう - テンプレートにforループを含めるように質問を変更しました。あなたは実際にforループを実行するまでSQLに問い合わせていないと言っていますか?もしそうなら、私はページャーがどのくらい多くのページを知っているか理解していません。 –

+0

@Steve Suh - Ticket.objects.filter(...)が返すクエリセットオブジェクトがある場合は、queryset.count()を別々に呼び出すことができ、別のCOUNT(*)クエリを発行します。これがページネーションがやっていることです。 –

関連する問題