2011-11-13 20 views
12

मैं Django कस्टम मॉडल प्रबंधकों का उपयोग करने के सही तरीके के बारे में उलझन में हूं - दस्तावेज़ों के आधार पर आप एक मॉडल के लिए फ़िल्टरिंग के तरीके के रूप में प्रबंधकों की एक श्रृंखला बना सकते हैं। लेकिन क्यों फ़िल्टरिंग के लिए कार्यों की श्रृंखला के साथ एक प्रबंधक वर्ग नहीं बनाते? क्या एक विधि दूसरे की तुलना में बेहतर है? और क्यों?Django कस्टम मॉडल प्रबंधक

उदाहरण के लिए:

class MaleManager(models.Manager): 
    def get_query_set(self): 
     return super(MaleManager, self).get_query_set().filter(sex='M') 

class FemaleManager(models.Manager): 
    def get_query_set(self): 
     return super(FemaleManager, self).get_query_set().filter(sex='F') 

class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female'))) 
    people = models.Manager() 
    men = MaleManager() 
    women = FemaleManager() 

बनाम

class PersonManager(models.Manager): 
    def males(self): 
     return super(MaleManager, self).get_query_set().filter(sex='M') 

    def females(self): 
     return super(FemaleManager, self).get_query_set().filter(sex='F') 

class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female'))) 
    people = PersonManager() 

Person.people.females() # to get list of females 
Person.people.males() # to get a list of males 

उत्तर

12
पहली विधि के साथ

आप लिख सकते हैं:

men = Person.men.all() 

या

peters_men = Person.men.filter(first_name='Peter') 

दूसरी विधि के लिए get_query_set मॉडल से 'उत्तराधिकारी' है, फिर यह अनुकूलन के बिना क्वेरी सेट वापस कर देता है। अगर आप एडमिन इंटरफ़ेस का उपयोग कर रहे हैं, तो मुझे आपकी दूसरी विधि को त्यागने का कोई कारण नहीं पता है, आपको यह जांचना चाहिए कि यह suported है।

इसके अलावा, दूसरी विधि के लिए आपको अपना प्रश्न सही करना चाहिए।

class PersonManager(models.Manager): 
    def males(self): 
     return super(PersonManager, self).get_query_set().filter(sex='M') 

Read django manager doc है: "आप Manager.get_query_set() विधि अधिभावी द्वारा एक प्रबंधक के आधार क्वेरीसमूह ओवरराइड कर सकते हैं get_query_set() गुण आप की आवश्यकता के साथ एक क्वेरीसमूह लौटना चाहिए।।"

संपादित 2017 सावधान रहें, get_query_setget_queryset करने के लिए 1.7 djanto से नाम दिया गया है। अधिक जानकारी Modifying a manager’s initial QuerySet

+1

हां लेकिन दोनों विधियां क्वेरीसेट लौट रही हैं ... तो Person.objects.females.filter (first_name = 'जेन') अभी भी काम नहीं करेगा? ... –

+1

@ 9-बिट्स: वास्तव में विधि को कॉल करना न भूलें। –

+0

@ IgnacioVazquez-Abrams आपका क्या मतलब है? Person.people.females.filter (first_name = 'जेन') नहीं होगा तो विधि को फ़िल्टर करें? –

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