Django मॉडल में create_foo () को क्यों परिभाषित करें? बनाने () को ओवरराइड करने के बजाय प्रबंधित करें?


10

Django डॉक्स को पढ़ना , यह प्रबंधक के Fooरूप create_fooमें परिभाषित करके एक मॉडल के लिए एक कस्टम निर्माण विधि बनाने की सलाह देता है :

class BookManager(models.Manager):
    def create_book(self, title):
        book = self.create(title=title)
        # do something with the book
        return book

class Book(models.Model):
    title = models.CharField(max_length=100)

    objects = BookManager()

book = Book.objects.create_book("Pride and Prejudice")

मेरा सवाल यह है कि पिछले एक को केवल बेस क्लास की createविधि को ओवरराइड करना क्यों पसंद किया जाता है :

class BookManager(models.Manager):
    def create(self, title):
        book = self.model(title=title)
        # do something with the book
        book.save()
        return book

class Book(models.Model):
    title = models.CharField(max_length=100)

    objects = BookManager()

book = Book.objects.create("Pride and Prejudice")

Imo ऐसा लगता है कि केवल ओवरराइडिंग createसे किसी को गलती से इसका उपयोग करने से रोका जा सकेगा, जिससे कि एक विकृत मॉडल का उदाहरण create_fooदिया जा सके , क्योंकि हमेशा पूरी तरह से बाईपास किया जा सकता है:

class BookManager(models.Manager):
    def create_book(self, title):
        book = self.create(title=title, should_not_be_set_manually="critical text")
        return book

class Book(models.Model):
    title = models.CharField(max_length=100)
    should_not_be_set_manually = models.CharField(max_length=100)

    objects = BookManager()

# Can make an illformed Book!!
book = Book.objects.create(title="Some title", should_not_be_set_manually="bad value")

क्या ऐसा करने में कोई फायदा है जैसे डॉक्स सुझाव देता है, या वास्तव में createसिर्फ उद्देश्यपूर्ण रूप से बेहतर है?

जवाबों:


10

हां, जाहिर है, आप ऐसा कर सकते हैं। लेकिन अगर आप प्रलेखन से उद्धृत उदाहरण के करीब दिखते हैं, तो यह इस बारे में नहीं है कि आपको निर्माण करना चाहिए या नहीं, इसके बारे में है

यदि आप ऐसा करते हैं, तो, ध्यान रखें कि कॉलिंग सिग्नेचर को न बदलें क्योंकि किसी भी परिवर्तन से मॉडल की आवृत्ति को बचाया जा सकता है।

कॉलिंग सिग्नेचर को संरक्षित करना । क्योंकि आपके लिए उपलब्ध इंटरफेस भी आंतरिक रूप से django द्वारा उपयोग किया जा सकता है। यदि आप उन्हें संशोधित करते हैं, तो चीजें आपके लिए नहीं बल्कि Django के लिए टूट सकती हैं।

इस उदाहरण में, वे createमॉडल निर्माता के लिए यह सुझाव नहीं दे रहे हैं ।

दूसरे , यहां तक ​​कि मानक इंटरफ़ेस createकेवल कीवर्ड तर्क ले रहा है

def create(self, **kwargs):

लेकिन यदि आप इसे स्थिति संबंधी तर्कों को लेने के लिए संशोधित करते हैं, तो def create(self, title):यह जहाँ भी Django के अंदर या मानक तरीके से उपयोग किया जाता है , वह टूट जाएगा। तो तुम चाहिए का विस्तार मौजूदा कार्यक्षमता नहीं संशोधित और सबसे शायद तोड़ने यह।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.