2012-09-05 21 views
6

मुझे सभी पुनर्प्राप्त डेटा पर पेजिंग करने के बजाय वास्तविक अंकन करने की आवश्यकता है। Django दस्तावेज़ीकरण साइट में उदाहरण, जैसा है;Django पेजिनेशन

def listing(request): 
    contact_list = Contacts.objects.all() 
    paginator = Paginator(contact_list, 25) # Show 25 contacts per page 

    page = request.GET.get('page') 
    try: 
     contacts = paginator.page(page) 
    except PageNotAnInteger: 
     # If page is not an integer, deliver first page. 
     contacts = paginator.page(1) 
    except EmptyPage: 
     # If page is out of range (e.g. 9999), deliver last page of results. 
     contacts = paginator.page(paginator.num_pages) 

    return render_to_response('list.html', {"contacts": contacts}) 

यह कोड सभी पुनर्प्राप्त रिकॉर्ड्स पर रिकॉर्डिंग रिकॉर्ड है। लेकिन एक परेशानी है। यदि रिकॉर्ड इतने सारे रिकॉर्ड हैं तो सभी रिकॉर्ड को पुनः प्राप्त करने का प्रयास करने में कई बार लगते हैं। मुझे डेटाबेस से पृष्ठ द्वारा रिकॉर्ड्स पेज पुनर्प्राप्त करने के लिए एक समाधान की आवश्यकता है।

क्या Django में ऐसा करने का कोई और समाधान है?

+1

इस सवाल से पहले उत्तर दिया गया है, यहाँ देखें: http://stackoverflow.com/questions/10548744/django-lazy-queryset-and-pagination –

उत्तर

18

आप झूठी धारणा करते हैं। Django paginating करते समय सभी ऑब्जेक्ट्स को पुनर्प्राप्त नहीं करता है: यह क्वेरीसेट को उचित रूप से स्लाइस करता है, जो SQL पर LIMIT और COUNT का उपयोग करता है।

+0

क्या आपका मतलब है ; कोड में contact.objects.all() लाइन प्रश्न में दी गई है, सभी रिकॉर्ड पुनर्प्राप्त नहीं करता है? –

+4

सही। क्वेरी सेट आलसी हैं, क्योंकि डॉक्स समझाते हैं, और जब तक वे पुनरावृत्त या कटा हुआ नहीं होते हैं तब तक कोई डीबी कॉल नहीं किया जाता है। –

+0

वास्तव में मुझे यह उल्लेख करना चाहिए था कि मैं डीजेंगो मॉडलिंग के लिए मोंगोडीबी और मोंगो कांटा का उपयोग कर रहा हूं। शायद यह एसक्यूएल डेटाबेस के लिए है, मोंगो कांटा नहीं। क्योंकि मैंने कोशिश की, यह अभी भी डीबी से सभी डेटा retreives। यह शायद डीजेंगो के लिए मोंगो कांटा की कमी है। लेकिन धन्यवाद, मुझे यह नहीं पता था। –

0

पेजिनेटर क्लास (django/core/paginator.py) के अंदर देखो, यह केवल आवश्यक पृष्ठों को प्राप्त करता है। बड़ी तालिकाओं पर केवल एक समस्या है: यदि आप कुल पृष्ठ संख्याएं दिखाना चाहते हैं तो आपको पूरी तालिका पर गिनती (*) बनाना होगा जो कुछ डेटाबेसों में लंबा समय ले सकता है (यानी postgresql, innsb के साथ mysql)।

बीटीडब्ल्यू, डीजेंगो में सामान्य दृश्यों का उपयोग करने का प्रयास करें, ListView यहां ठीक होगा।

0

QuerySet एक आलसी वस्तु है। जब आप contact_list = Contacts.objects.all() असाइन करते हैं, तो Django डेटाबेस को हिट नहीं करेगा। जब तक आप count(), filter(), first(), ..., या contact_list[1:5] जैसी विधियों को कॉल करते हैं, तो Django वास्तव में डेटाबेस से डेटा पुनर्प्राप्त करेगा। एसक्यूएल स्टेटमेंट्स जो Django उत्पन्न करता है प्रत्येक विधि से संबंधित होगा और इन SQL स्टेटस को डीबी को भेजा जाएगा।

E.g: contact_list[1:5] एक SQL कथन उत्पन्न करता है LIMIT और OFFSET खंड।

Paginator कक्षा में, QuerySet इसके निर्माता

paginator = Paginator(contact_list, 25) 

जब आप paginator.page(page) कॉल करने के लिए पारित कर दिया जाएगा, बयान में कहा जाता है:

return self._get_page(self.object_list[bottom:top], number, self) 
संबंधित मुद्दे