1

Django では、次のようにページネーターを使用します。

django.core.paginator からインポート Paginator、EmptyPage、PageNotAnInteger

def myView(request):
    ...
    paginator = Paginator(Annonce.objects.filter(name="huhu"), 10)
    paginator._count = s.count()
    try:
        annonces = paginator.page(page)
    except PageNotAnInteger:
        annonces = paginator.page(1)
    except EmptyPage:
        annonces = paginator.page(paginator.num_pages)

s.search() 関数で、postgres db に対してクエリを実行します。

1 ページあたり 10 アイテムを表示しても、クエリは制限されないことがわかりました。

クエリを a で制限しAnnonce.objects.filter(name="huhu")[:10]、カウントを自分で指定しようとしました。しかし、そうするとページネーターが機能しません。

これを最適化する方法はありますか?

4

1 に答える 1

11

この例https://docs.djangoproject.com/en/dev/topics/pagination/#using-paginator-in-a-viewを、django Paginator を適切に使用するビュー関数を作成するためのガイドとして使用してください。

コード スニペットの例では、次のことに注意してください。

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

    page = request.GET.get('page')  # <--- This is the key to your solution.

contact_list実際にはまだ評価されていない割り当てられたクエリセットです。a へのpaginator = Paginator(contact_list, 25)代入Paginator instanceは怠惰で、実際には必要になるまで実行されません。

page = request.GET.get('page')URL から追加の GET 変数?page=2を (例として) 取得します。http://localhost:8000/my/listing?page=2リスト ページの 2 ページ目に表示される 25 個のオブジェクトを取得しようとすると、URL は実際には次のようになります。

これは、データベースへの実際のクエリが実行される場所です:-

try:
    contacts = paginator.page(page)
except PageNotAnInteger:
    # If page is not an integer, deliver first page.
    contacts = paginator.page(1)

contacts = paginator.page(page)、データベースに対してクエリを実行し、指定されたページ番号と、ページごとに「25」オブジェクトが必要であるという条件に基づいて、限られたオブジェクトのセットのみを取得します。

于 2012-11-04T02:13:24.110 に答える