2013-02-25 15 views
9

मेरे पास एक मौजूदा सिस्टम है जहां मैं एक व्यवस्थापक इनलाइन में प्रदर्शित संबंधित ऑब्जेक्ट की संख्या को सीमित करना चाहता हूं।django व्यवस्थापक इनलाइन क्वेरीसेट सीमा

उदाहरण के लिए, मेरे पास एक इनलाइन के साथ व्यवस्थापक में एक मॉडल है जिसमें हजारों संबंधित रिकॉर्ड हो सकते हैं। मैं केवल सबसे हालिया रिकॉर्ड प्रदर्शित करना चाहता हूं (5K सबसे नाराज रिकॉर्ड कहें)। (आदर्श रूप में, कोई इनलाइन रिकॉर्ड के माध्यम से पेजिंग करने में सक्षम होगा, लेकिन केवल उन्हें सीमित करना मेरे लिए पर्याप्त होगा।) मैं उस स्थिति से बचना चाहता हूं जहां एक व्यवस्थापक पृष्ठ 60 के इनलाइन रिकॉर्ड के साथ लोड होता है, जो ब्राउज़र को क्रैश करता है और सर्वर को कर देता है। How to limit queryset/the records to view in Django admin site?

class TicketNoteAdmin(models.TabularInline): 
    model = models.TicketNote 
    def queryset(self, request): 
     qs = super(TicketNoteAdmin, self).queryset(request).order_by('-created')[:5000] 
     return qs 

हालांकि, मैं एक "एक प्रश्न एक बार एक टुकड़ा लिया गया है फ़िल्टर नहीं कर सकते" मिलती है:

अतः निम्नलिखित प्रश्न आधार पर, मैं निम्नलिखित स्निपेट बना लिया है। मैंने एक पेजिनेटर का उपयोग करने का भी प्रयास किया है, लेकिन एक ही त्रुटि प्राप्त करें।

from django.core.paginator import Paginator 

class TicketNoteAdmin(models.TabularInline): 
    model = models.TicketNote 
    def queryset(self, request): 
     qs = super(TicketNoteAdmin, self).queryset(request).order_by('-created') 
     p = Paginator(qs, 5000) 
     page1 = p.page(1) 
     return page1.object_list 

मुझे समझ में क्यों मैं इस त्रुटि हो रही है, लेकिन अगर वहाँ एक अलग दृष्टिकोण है कि मुझे इनलाइन वस्तुओं का प्रदर्शन किया की संख्या को सीमित करने की अनुमति होगी है सोच रहा हूँ। शायद व्यवस्थापक को इन कई इनलाइन ऑब्जेक्ट्स के साथ काम करने के लिए डिज़ाइन नहीं किया गया था, लेकिन ऐसा लगता है कि व्यवस्थापक इनलाइन रिकॉर्ड-सेट को सीमित करने और उन स्थितियों को रोकने का तरीका होना चाहिए जहां ब्राउज़र/सर्वर बहुत अधिक इनलाइन ऑब्जेक्ट्स के कारण क्रैश हो सकता है। किसी भी सलाह की बहुत प्रशंसा की जाएगी। पढ़ने के लिए धन्यवाद।

उत्तर

10

इस प्रयास करें:

from django.forms.models import BaseInlineFormSet 

class TicketNoteFormSet(BaseInlineFormSet): 
    def get_queryset(self) : 
     qs = super(TicketNoteFormSet, self).get_queryset() 
     return qs[:5000] 

class TicketNoteAdmin(models.TabularInline): 
    model = models.TicketNote 
    formset = TicketNoteFormSet 
+1

formset कोड सिर्फ मानता है कि get_queryset ही क्वेरीसमूह वस्तु हर बार वापस आ जाएगी और उस क्वेरीसमूह डीबी परिणाम कैश्ड होगा। इसके बाद बेसमोडेलफॉर्मसेट की get_queryset स्पष्ट रूप से स्वयं पर क्यूएस इंस्टेंस सहेजती है। यदि आप उस विधि को ओवरराइड करते हैं और आप हजारों डीबी प्रश्न नहीं चाहते हैं तो आपको ऐसा करने की आवश्यकता होगी। –

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