私はしばらく前に使ったdjangoページネーションのコード例がいくつかありました。私は間違っているかもしれませんが、コードを見てみると、それは膨大なメモリを浪費するようです。私はよりよい解決策を探していた、ここではコードです:私はこのコードのsubtltiesのかわからないけど効率的なページ番号付けとdjangoでのデータベースクエリ
# in views.py
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
...
...
def someView():
models = Model.objects.order_by('-timestamp')
paginator = Paginator(models, 7)
pageNumber = request.GET.get('page')
try:
paginatedPage = paginator.page(pageNumber)
except PageNotAnInteger:
pageNumber = 1
except EmptyPage:
pageNumber = paginator.num_pages
models = paginator.page(pageNumber)
return render_to_resp (..... models ....)
それがどのように見えるか、コードの最初の行は、データベースからすべての単一のモデルを取得しますからそれを押し込む。それから、それは、ユーザがHTML GETからどのページにいるかに基づいてそれをチャンクアップするPaginatorに渡されます。 paginatorはこれを何らかの形で受け入れ可能にしていますか?これは完全にメモリが非効率的ですか?それが非効率な場合、どのように改善できますか?
また、関連するトピックです。誰かがない場合:
Model.objects.all()[:40]
このコードは、すべてのモデルがメモリ内に押し込まれ、我々は彼らの40をスプライスしていることを意味するのでしょうか?どちらが悪いですか。それとも、40個のオブジェクトだけを照会してメモリ期間に押し込むということですか?
ありがとうございました!
Yeah but .. modelsは、データベース全体のモデルオブジェクトのすべてで、最初の行にそのオブジェクトが正しくロードされています。あなたはかわい子のようなものを殺していると言っていますか? URの2番目の答えは、はい新しいリストが作成されますが、古いものはまだちょうどそこに右ですか?それともそれはただの黙示録が消えるのだろうか? –
2番目の答えは、古いリストの参照カウントが0になるため、ガベージコレクションが発生したときに古いリストに到達する手段がないため、ガベージコレクションされます。 –
最初の答えでは、modelsはデータベース内のすべてのモデルオブジェクトであり、ビューの全期間にわたってメモリに格納されます。そして、それ以外の場合は、djangoは特定のページにどのようなオブジェクトを表示するのかを知っていなければなりません。 Djangoはすべてのオブジェクトを提供し、それからあなたが望むページを伝えたら、djangoがスライスして新しいリストを返します。 –