Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么要在Django models.Manager中定义create_foo(),而不是重写create()?_Python_Django_Django Models_Django Managers - Fatal编程技术网

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内部或以标准方式使用的任何地方中断。因此,您应该扩展现有功能,而不是修改,很可能中断它