C'erano alcuni esempi di codice per l'impaginazione del django che ho usato qualche tempo fa. Potrei sbagliarmi ma guardando il codice sembra che sprechi tonnellate di memoria. Ero alla ricerca di una soluzione migliore, ecco il codice:Impaginazione efficiente e interrogazione del database in 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 ....)
Non sono sicuro delle subtlties di questo codice, ma da quello che sembra, la prima riga di codice recupera ogni singolo modello dal database e lo spinge dentro Quindi viene passato in Paginator che lo suddivide in base alla pagina in cui si trova l'utente da un GET html. In qualche modo, paginator lo rende accettabile, oppure è totalmente inefficiente? Se è inefficiente, come può essere migliorato?
Inoltre, un argomento correlato. Se qualcuno fa:
Model.objects.all()[:40]
Questo codice significa che tutti i modelli sono spinti nella memoria, e noi splice fuori 40 di loro? Che è cattivo O significa che interrogiamo e spingiamo solo 40 oggetti nel periodo di memoria?
Grazie per il vostro aiuto!
Sì, ma i modelli sono tutti gli oggetti del modello nell'intero database, sono caricati proprio nella prima riga. Stai dicendo che paginator lo uccide o qualcosa del genere? Per la seconda risposta, sì, viene creata una nuova lista ma quella vecchia è ancora lì, giusto? O semplicemente scompare? –
Per la seconda risposta, poiché il conteggio dei riferimenti per la vecchia lista sarà 0, sarà garbage collection quando si verifica la garbage collection poiché non è possibile raggiungere la vecchia lista. –
Per la prima risposta, sì, i modelli sono tutti gli oggetti del modello nel database e saranno in memoria per l'intero periodo della visualizzazione. E tu lo vuoi diversamente, come si suppone che Django sappia quali oggetti mostrare su una determinata pagina? Django può farlo solo se gli fornisci tutti gli oggetti e poi gli dici quale pagina vuoi e poi django eseguirà l'affettamento e ti restituirà una nuova lista. –