9

取得したすべてのデータをページ付けするのではなく、実際のページ付けを行う必要があります。Djangoドキュメントサイトの例は次のようになります。

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でこれを行う別の解決策はありますか?

4

4 に答える 4

21

あなたは誤った仮定をします。Djangoは、ページ付け時にすべてのオブジェクトを取得するわけではありません。クエリセットを適切にスライスし、SQLでLIMITとCOUNTを使用します。

于 2012-09-05T07:03:53.287 に答える
0

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

ところで、djangoでジェネリックビューを使用してみてください。ここではListViewで問題ありません。

于 2012-09-05T07:02:35.860 に答える
0

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

例:contact_list[1:5]SQLステートメントのhaveLIMITおよびOFFSET句を生成します。

Paginatorクラスでは、QuerySetコンストラクターに渡されます

paginator = Paginator(contact_list, 25)

を呼び出すpaginator.page(page)と、ステートメントが呼び出されます。

return self._get_page(self.object_list[bottom:top], number, self)
于 2017-03-28T05:25:50.153 に答える
0

ここではget_page()、ページごとのデータを取得するために使用しています(1ページには25個のデータが含まれています)。

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

    return render_to_response('list.html', {"contacts": contacts})
于 2020-08-23T03:45:51.363 に答える