1

Django の paginator モジュールがどのように機能し、どのように最適化するかについて質問があります。インターネット上のさまざまな API から取得した情報から、約 300 項目のリストがあります。Django のページネーター モジュールを使用して、訪問者のリストを一度に 10 項目ずつ表示しています。ページネーションが思い通りに機能しません。ページネーターは、ページが変更されるたびに表示する必要がある 10 個の項目を引き出す前に、300 個の項目すべてを取得する必要があるようです。たとえば、30 ページある場合、ページ 2 に移動するには、Web サイトで API を再度クエリし、すべての情報をリストに入れ、訪問者のブラウザーが要求する 10 個にアクセスする必要があります。各ページめくりで既に持っているのと同じ情報を API に照会し続けたくありません。

現在、私のビューには、get リクエストを見て、クエリに基づいて API に情報を問い合わせる関数があります。次に、そのすべての情報をリストに入れ、テンプレート ファイルに渡します。そのため、この関数は、誰かがページをめくるたびに常に読み込まれ、API を再度クエリすることになります。

これを修正するにはどうすればよいですか?

ご協力ありがとうございました。

4

2 に答える 2

1

この場合、ページネーターはその仕事をするために完全なリストを必要とします。

私のアドバイスは、フィードのキャッシュを定期的に更新してから、そのキャッシュをpaginatorモジュールへの入力として使用することです。すべてのリクエストに対して集中的または長期的なタスクを実行することは、常に悪い考えです。ユーザーが経験するページの読み込み時間でない場合は、攻撃に対するサーバーの脆弱性を考えてください。

Djangoの低レベルキャッシュAPIを確認すると、フィードの結果をキーの下のグローバルにアクセス可能な場所に保存できます。このキーを使用して、後でキャッシュを取得し、各ページリクエストをページ分割できます。

于 2011-01-04T22:41:11.053 に答える
0

ORMは、行が選択されるまでデータをロードしません。

query_results = Foo(id=1) # No sql executed yet, just stored.

foo = query_results[0] # now it fires

また

for foo in query_results:
   foo.bar() # sql fires

初期化時に結果をロードするカスタムデータソースを使用している場合、すべてのフィードが一度にフェッチされるため、ページネーションは期待どおりに機能しません。サブクラス化するか、実際のフェッチを実行することをお勧めし__getitem__ます__iter__。これは、Djangoが結果が読み込まれることを期待する方法と一致します。

ページ付けでは、has_next()のようなことを行うためにいくつの結果があるかを知る必要があります。count(*)SQLでは、通常、インデックス付きのを取得するのは安価です。したがって、結果がいくつあるかを知りたいと思うでしょう(または、正確に知るには費用がかかりすぎるかどうかを見積もるだけです)。

于 2011-01-04T23:06:50.937 に答える