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
सिर्फ उद्देश्यपूर्ण रूप से बेहतर है?