2012-05-11 9 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 = 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

बहुत बढ़िया। मुझे पता नहीं था कि प्रश्नों के निर्माण के लिए डीजेंगो के पास उपकरण हैं या नहीं। – starcorn

+3

@starcorn [django-debug-toolbar] पर एक नज़र डालें (https://github.com/django-debug-toolbar/django-debug-toolbar) – DrTyrsa

+0

डीबग टूलबार एक उपकरण है जो प्रत्येक Django dev का उपयोग करना चाहिए, यह है अविश्वसनीय रूप से सुविधाजनक। – rectangletangle

3

यह है। Django का पेजिनेशन वही नियम/अनुकूलन का उपयोग करता है जो क्वेरीसेट पर लागू होते हैं।

इसका मतलब यह है कि यह return HttpResponse(output)

संबंधित मुद्दे