0

私の見解では、次のような通常のページ付けがあります。

paginator = Paginator(book_list, 100)

そして、私の見解では、値をテンプレートに渡しています。

return render(request,
...
'paginator': paginator,
...

そして、ページネーション用のカスタムタグがあり、次のようにロードしています:

{% if paginator.count > paginator.per_page %}
    {% load paginator %}
    {% paginator 3 %}
{% endif %}

私のカスタム テンプレート ページネーション タグには、コードに沿って次のコードがあります。

def paginator(context, adjacent_pages=2):
    page_obj = context['paginator'].page(context['object_list'].number)
    ...
    'hits': context['paginator'].count,
    ...

すべてが期待どおりに機能していますが、心配ですcontext['paginator'].page(context['object_list'].number).DjangoはこのビットでDBからデータをフェッチしていますか、それともメインビューからフェッチされたのと同じデータを使用していますか?

お知らせ下さい。ありがとう。

4

2 に答える 2

3

ページネーターは、query_set を object_list として保持します。django 1.3.4 では、ページ メソッドは次のとおりです。

def page(self, number):
    "Returns a Page object for the given 1-based page number."
    number = self.validate_number(number)
    bottom = (number - 1) * self.per_page
    top = bottom + self.per_page
    if top + self.orphans >= self.count:
        top = self.count
    return Page(self.object_list[bottom:top], number, self)

dbに関連する最後の行のみ、

self.object_list[bottom:top]

object_list は単なる QuerySet であるため、複数のクエリが存在するかどうかにかかわらず、query_set[x:y] をさらに呼び出すと問題が発生します。

Django の query_set は遅延型です。反復処理を行わないと、SQL はトリガーされません。それ以外の場合は、db クエリが発生します。

次のコードでは、django.db.connection.queries でチェック クエリを使用できます。

   from django.db import connection

   original = XXXX.objects.filter(...)
   res1 = original[x:y]
   for item in res1:
     print item
   print len(connection.queries), connection.queries[-1]

   res2 = original[x:y]
   for item in res2:
     print item
   print len(connection.queries), connection.queries[-1]

クエリの長​​さが長くなることがわかります。

于 2012-12-27T08:07:01.510 に答える
1

ここでの私の理解は、メインビューで渡したオブジェクトを使用しているだけだということです。 クラス のインスタンスである、コンテキストに渡しcontext['paginator']た変数に格納されているオブジェクトを返します。paginatorPaginator

データベースに戻るかどうかの問題は、単に.page(...)メソッドに関するものです。呼び出しPaginator.page(...)によってデータベースクエリが発行されると、データベースに戻ります。その値はキャッシュされません。ただし、その情報がpaginator変数でローカルにすでに利用可能であり.page、それがメソッドによって呼び出される場合は、データベースからデータを再フェッチしていません。

于 2012-12-27T07:37:47.537 に答える