2012-05-11 72 views
16

我讀here Django查詢集是懶惰的,它不會被評估,直到它實際上打印。我用django的內置分頁做了一個簡單的分頁。我沒有意識到已經有應用程序,例如「django-pagination」和「django-endless」,它們可以完成這項工作。Django懶惰QuerySet和分頁

反正我不知道查詢集是否仍然懶惰,當我舉例來說做到這一點

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

而這部分被稱爲我想任何網頁我現在我要查看每一次。

我需要知道,因爲我不想對數據庫造成不必要的負載。

回答

32

如果你想看到那裏正在發生,導入django.db.connection和檢查queries

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

讓我們創建的分頁程序,並查看是否有任何疑問出現:

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

還沒有。

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

創建頁面產生了一個查詢,以計算查詢集中有多少條目。這些條目還沒有被提取。

指定頁面的對象變量「對象」:

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

這仍然沒有引起條目是牽強。

生成HttpResponse從對象列表

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

最後,這些項目已被取出。

+3

太棒了。我不知道django有檢查是否有查詢的工​​具。 – starcorn

+3

@starcorn查看[django-debug-toolbar](https://github.com/django-debug-toolbar/django-debug-toolbar) – DrTyrsa

+0

調試工具欄是每個Django開發人員都應該使用的工具,它是令人難以置信的方便。 – rectangletangle

3

它是。 Django的分頁使用與查詢集相同的規則/優化。

這意味着它將開始評估對return HttpResponse(output)