Python 为什么要在Django models.Manager中定义create_foo(),而不是重写create()?
阅读,它建议为名为Python 为什么要在Django models.Manager中定义create_foo(),而不是重写create()?,python,django,django-models,django-managers,Python,Django,Django Models,Django Managers,阅读,它建议为名为Foo的模型创建自定义创建方法,方法是在管理器中将其定义为create\u 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): t
Foo
的模型创建自定义创建方法,方法是在管理器中将其定义为create\u 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")
在我看来,只有重写create
才能防止任何人意外地使用它来创建错误的模型实例,因为create\u 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,而在于
但是,如果您这样做,请注意不要更改呼叫签名
因为任何更改都可能会阻止保存模型实例
保留调用签名。因为django内部也可能使用可供您使用的接口。如果你修改它们,对你来说,事情可能不会破裂,但对Django来说
在本例中,他们不是建议将此用于create
,而是建议使用模型构造函数
其次,即使是create
的标准接口也只接受关键字参数
def create(self, **kwargs):
但是,如果您将其修改为采用位置参数,defcreate(self,title):
它将在Django内部或以标准方式使用的任何地方中断。因此,您应该扩展现有功能,而不是修改,很可能中断它