0

Iamは私のWebページでページ付けを使用しようとしています。だから私はここのdjangoドキュメントで例を見つけました 。

from django.core.paginator import Paginator, InvalidPage, EmptyPage

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

    # Make sure page request is an int. If not, deliver first page.
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    # If page request (9999) is out of range, deliver last page of results.
    try:
        contacts = paginator.page(page)
    except (EmptyPage, InvalidPage):
        contacts = paginator.page(paginator.num_pages)

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

この例の問題は、ページ付けするためにすべてのアイテムを一度にロードしていることです。しかし、私のデータベースには20000エントリがあり、それらすべてを一度にロードすることはできません。では、クエリを最適化する方法はありますか?

4

2 に答える 2

2

一度にすべてのオブジェクトをメモリにロードする場合、それはバグです。QuerySetにフィードする前にリストに s を明示的にキャストしない限り、ページネーターは1 つのクエリを使用してPaginatorに一致する行数のみをフェッチし、表示される行のみをフェッチするように適切に制限します。QuerySetQuerySet

すべてのオブジェクトをロードしていると本当に思われる場合は、これを確認するために、django-debug-toolbarを使用して、実行されたクエリを調べます。本当にすべてをロードする場合は、Django のトラックにバグを報告してください。

于 2012-05-09T08:32:17.940 に答える
1

settings.py で に設定DEBUGするFalseと、パフォーマンスが大幅に向上します。デバッグ モード (とりわけ) では、SQL キャッシングがオンになり、処理が大幅に遅くなる可能性があります。

于 2012-05-09T11:13:35.547 に答える