2012-05-11 64 views
16

czytam here że querysets Django są leniwi, nie będą oceniane, dopóki nie zostanie faktycznie wydrukowany. Zrobiłem prostą paginację za pomocą wbudowanej paginacji django. Nie zdawałem sobie sprawy, że istnieją już takie aplikacje, jak "django-pagination" i "django-endless", dla których to zadanie jest przeznaczone.Django leniwy QuerySet i paginacja

każdym razie zastanawiam się, czy QuerySet jest jeszcze leniwy, kiedy na przykład zrobić

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

I ta część jest wywoływana za każdym razem chcę dostać cokolwiek strona Obecnie chcę obejrzeć.

Muszę wiedzieć, ponieważ nie chcę niepotrzebnego obciążenia do bazy danych.

Odpowiedz

32

Jeśli chcesz zobaczyć, gdzie występują, importować django.db.connection i skontrolować queries

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

Pozwala stworzyć paginator, i sprawdzić, czy występują jakieś pytania:

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

Brak.

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

Utworzenie strony wygenerowało jedno zapytanie, aby policzyć liczbę wpisów w zapytaniu. Wpisy nie zostały jeszcze pobrane.

Przypisywanie obiektów strony do zmiennej „obiektów”:

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

To jeszcze nie spowodował wpisy być naciągane.

Generowanie HttpResponse z listy obiektów

>>> 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'}] 

Wreszcie wpisy zostały pobrane.

+3

Awesome. Nie wiedziałem, że django ma narzędzia do sprawdzania, czy zapytania są tworzone. – starcorn

+3

@starcorn Spójrz na [django-debug-toolbar] (https://github.com/django-debug-toolbar/django-debug-toolbar) – DrTyrsa

+0

Pasek debugowania jest narzędziem, które każdy powinien używać Django dev, to niezwykle wygodne. – rectangletangle

3

Jest. Paginacja Django używa tych samych reguł/optymalizacji, które dotyczą zestawów zapytań.

Oznacza to zacznie oceny na return HttpResponse(output)

Powiązane problemy