1

Djangoに一般的なリストビューがあり、約300個のオブジェクトが返されます(検索が実行されない限り)。

10個のオブジェクトのみを表示するようにページ付けを設定しました。

そこで、データベースにクエリを実行し、オブジェクトを反復処理して処理し、表示前に値を追加します。300個のオブジェクトすべてが処理を完了し、処理後にページネーションが行われることに気付きました。そのため、パフォーマンスを向上させるために、表示されるオブジェクトに対してのみ処理を実行したいと思います。

1ページ目は0-10、2ページ目は11-20、3ページ目は21-30など、クエリセット内のオブジェクトのインデックスを計算します。

ここで、表示範囲内のオブジェクトのみを処理し、完全なクエリセットを返します(したがって、ジャンルビューは期待どおりに機能します)。

最初に試しました:

for object in queryset[slice_start:slice_end] :
     # process things here

return queryset

しかし、スライスは新しいクエリセットを返すようであり、元のクエリセットオブジェクトには計算された値がありません。

現在、私の解決策は次のとおりです。

index = -1
for object in queryset:
     index += 1   
     if index < slice_start or index > slice_end : continue
     # process things here
return queryset 

現在、これは機能しますが、Pythonにとってはかなりハッキーで、非合法のようです。これを行うためのよりPython的な方法はありますか?

4

2 に答える 2

2

Django のPaginatorクラス ( docs ) を使用している場合は、現在のページをリクエストして、ビュー内のそれらのオブジェクトを反復処理できます。

from django.core.paginator import Paginator

# in the view:
p = Paginator(objects, 2)
page = p.page(current_page)
for o in page.object_list:
    # do processing
    pass

current_pageの値は、リクエストのパラメータ ( のパラメータなど) からpage取得できますrequest.GET

于 2012-06-13T10:07:50.517 に答える
1

の結果に対して処理を行う必要がありpage.object_listます。これには、そのページのオブジェクトのみが含まれていることが保証されます。

于 2012-06-13T10:08:52.130 に答える