2012-09-05 8 views
6

私は、すべての収集データに改ページするのではなく、実際の改ページを行う必要があります。 Djangoドキュメンテーションサイトの例は次のようなものです。Django Pagination

def listing(request): 
    contact_list = Contacts.objects.all() 
    paginator = Paginator(contact_list, 25) # Show 25 contacts per page 

    page = request.GET.get('page') 
    try: 
     contacts = paginator.page(page) 
    except PageNotAnInteger: 
     # If page is not an integer, deliver first page. 
     contacts = paginator.page(1) 
    except EmptyPage: 
     # If page is out of range (e.g. 9999), deliver last page of results. 
     contacts = paginator.page(paginator.num_pages) 

    return render_to_response('list.html', {"contacts": contacts}) 

このコードは、記録されたすべてのレコードのページ番号を設定しています。しかし、問題があります。非常に多くのレコードがある場合、すべてのレコードを取得しようとすると多くの時間がかかります。データベースからページごとにレコードページを取得するソリューションが必要です。

Djangoでこれを行う別の解決方法はありますか?

+1

この質問は前に回答されている、ここを参照してください:Paginatorクラスで

QuerySetはあなたがpaginator.page(page)を呼び出すと、文が呼ばれ、そのコンストラクタ

paginator = Paginator(contact_list, 25) 

に渡されます http://stackoverflow.com/questions/10548744/django-lazy-queryset-and-pagination –

答えて

18

あなたは誤った仮定をしています。 Djangoは、ページング時にすべてのオブジェクトを取得しません。クエリーセットを適切にスライスします。これは、SQLに対してLIMITとCOUNTを使用します。

+0

;コードのContacts.objects.all()行が問題になっていますが、すべてのレコードを取得していませんか? –

+4

正しい。クエリーセットはドキュメントが説明するように怠惰であり、反復またはスライスされるまでdbコールは行われません。 –

+0

実際に私はDJangoモデリングのためにMongoDBとMongo forkを使用していると言及しておくべきです。おそらくこれはSQLデータベース用であり、Mongo forkではありません。私はそれを試したので、それはまだdbからすべてのデータを取得します。おそらく、DJangoのためのMongo forkがないでしょう。しかし、私はそれを知らなかったことに感謝します。 –

0

Paginatorクラス(django/core/paginator.py)を見ると、必要なページだけがフェッチされます。大きなテーブルには問題が1つしかありません。ページ全体の数を表示したい場合は、テーブル全体でcount(*)を行う必要があります。これは一部のデータベース(postgresql、mysql with innodb)で時間がかかることがあります。

ところで、djangoで一般的なビューを使用しようとすると、ListViewはここで問題ありません。

0

QuerySetは遅延オブジェクトです。 contact_list = Contacts.objects.all()を割り当てると、Djangoはデータベースにヒットしません。 count()filter()first()、...、またはcontact_list[1:5]などのメソッドを呼び出すまで、Djangoは実際にデータベースからデータを取得します。 Djangoが生成するSQL文は、各メソッドに関連付けられ、これらのSQL文がDBに送信されます。

例:contact_list[1:5]LIMITOFFSETという句を持つSQL文を生成します。

return self._get_page(self.object_list[bottom:top], number, self) 
関連する問題