2009-09-03 16 views
17

मैं django के साथ सरल एप्लिकेशन बना रहा हूं। साथ ही, मुझे एहसास हुआ कि मैं अक्सर कुछ प्रकार के संचालन कर रहा हूं। उदाहरण के लिए मुझे अक्सर उन सभी आलेख ऑब्जेक्ट्स प्राप्त करने की आवश्यकता होती है जिनमें Publick = True है। तो मैं सोच रहा हूं कि मॉडल में get_published फ़ंक्शन को परिभाषित करना संभव है?Django मॉडल, कस्टम फ़ंक्शन

(सरलीकृत) अगर मॉडल इस तरह दिखता है

class Article(models.Model): 
    title = models.CharField(...) 
    isPublished = models.BooleandField() 

    def get_active(self): 
     return Article.objects.filter(isPublicshed = 1) 

लेकिन आप समारोह को लागू करने का एक तरीका बता सकते हैं यह इस तरह से

काम नहीं करता है?

उत्तर

53

क्या आप शायद चाहते हैं एक custom manager

Django डॉक्स से

है:

 # An example of a custom manager called "objects". 

class PersonManager(models.Manager): 
    def get_fun_people(self): 
     return self.filter(fun=True) 

class Person(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 
    fun = models.BooleanField() 
    objects = PersonManager() 

    def __unicode__(self): 
     return u"%s %s" % (self.first_name, self.last_name) 

जो तब आप की तरह कुछ करने के लिए अनुमति देता है: जैसा कि docs here में कहा गया है

>>> p1 = Person(first_name='Bugs', last_name='Bunny', fun=True) 
>>> p1.save() 
>>> p2 = Person(first_name='Droopy', last_name='Dog', fun=False) 
>>> p2.save() 
>>> Person.objects.get_fun_people() 
[<Person: Bugs Bunny>] 
+3

अच्छा कोड उदाहरण। संक्षेप में django का एक हिस्सा समझाया जो पहले मुझे (मेरे नोबोसिसिटी) में व्यर्थ लग रहा था। +1। – chucksmash

12

, यदि आपको अपनी ऑब्जेक्ट्स में कस्टम पंक्ति-स्तर कार्यक्षमता जोड़ने की आवश्यकता है, तो आपको अपने मोड पर कस्टम विधियों को परिभाषित करने की आवश्यकता है ls। हालांकि, यदि आप इसके बाद क्या हैं टेबल-व्यापी कार्यक्षमता (जैसे कि सभी स्थितियों को प्राप्त करने वाले सभी आलेख ऑब्जेक्ट्स प्राप्त करना), तो आपको model Managers पर कस्टम विधियों को परिभाषित करना होगा (एसिन्ग्लियो उनके उत्तर में ऊपर दिए गए बिंदुओं के अनुसार)।

11

आप staticmethod सजावट का उपयोग कर सकते हैं।

class Article(models.Model): 
    title = models.CharField(...) 
    isPublished = models.BooleandField() 

    @staticmethod 
    def get_active(): 
     return Article.objects.filter(isPublished = 1) 
+0

इसे लाने के लिए धन्यवाद! मेरे, अलग, सवाल का जवाब दिया। – alexsalo

+1

इसके बजाय यह 'classmethod' होना चाहिए। –

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