2012-05-11 13 views
16

Ho letto here che i quayyset di Django sono pigri, non saranno valutati fino a quando non saranno effettivamente stampati. Ho effettuato una semplice impaginazione usando l'impaginazione incorporata del django. Non mi rendevo conto che esistevano già app come "django-pagination" e "django-endless" per cui fa questo lavoro.Query pigro DjangoImpostazione e impaginazione

Comunque mi chiedo se il QuerySet è ancora pigro quando io per esempio faccio

entries = Entry.objects.filter(...) 
paginator = Paginator(entries, 10) 
output = paginator.page(page) 
return HttpResponse(output) 

E questa parte è chiamata ogni volta che voglio per ottenere ciò che la pagina che attualmente voglio vedere.

Ho bisogno di sapere poiché non voglio caricare inutilmente il database.

risposta

32

Se volete vedere dove si stanno verificando, importare django.db.connection e ispezionare queries

>>> from django.db import connection 
>>> from django.core.paginator import Paginator 
>>> queryset = Entry.objects.all() 

Consente di creare il Paginator, e vedere se si verificano qualsiasi domanda:

>>> paginator = Paginator(queryset, 10) 
>>> print connection.queries 
[] 

Nessuno ancora.

>>> page = paginator.page(4) 
>>> page 
<Page 4 of 788> 
>>> print connection.queries 
[{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}] 

Creazione della pagina ha prodotto una query, per contare quante voci sono nel set di query. Le voci non sono state ancora recuperate.

assegnare gli oggetti della pagina per gli 'oggetti' variabili:

>>> objects = page.object_list 
>>> print connection.queries 
[{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}] 

Questo ancora non ha causato le voci siano scaricati.

Generare il HttpResponse dalla lista degli oggetti

>>> response = HttpResponse(page.object_list) 
>>> print connection.queries 
[{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}, {'time': '0.011', 'sql': 'SELECT `entry`.`id`, <snip> FROM `entry` LIMIT 10 OFFSET 30'}] 

Infine, le voci sono stati recuperati.

+3

Impressionante. Non sapevo che Django avesse strumenti per controllare se sono state fatte delle domande. – starcorn

+3

@starcorn Date un'occhiata a [django-debug-toolbar] (https://github.com/django-debug-toolbar/django-debug-toolbar) – DrTyrsa

+0

La barra degli strumenti di debug è uno strumento che ogni dev di Django dovrebbe usare, è incredibilmente conveniente. – rectangletangle

3

Lo è. L'impaginazione di Django utilizza le stesse regole/ottimizzazioni che si applicano ai querysets.

Questo significa che sarà iniziare a valutare il return HttpResponse(output)