Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.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:What';重写create()方法和save()方法之间的区别是什么?_Python_Django_Django Models - Fatal编程技术网

Python Django:What';重写create()方法和save()方法之间的区别是什么?

Python Django:What';重写create()方法和save()方法之间的区别是什么?,python,django,django-models,Python,Django,Django Models,我想覆盖一些模型行为,但不确定应该在哪里执行 如果我理解正确,那么create()方法只是save()方法的包装。我见过一些凌驾于行为之上的例子 , 在调用real save()方法之前 调用real save()方法之后 有什么区别 类博客(models.Model): name=models.CharField(最大长度=100) tagline=models.TextField() @类方法 def创建(cls,名称): blog=cls(name=name) #在您的示例中(来自Dja

我想覆盖一些模型行为,但不确定应该在哪里执行

如果我理解正确,那么
create()
方法只是
save()
方法的包装。我见过一些凌驾于行为之上的例子

  • ,
  • 在调用real save()方法之前
  • 调用real save()方法之后
  • 有什么区别


    类博客(models.Model):
    name=models.CharField(最大长度=100)
    tagline=models.TextField()
    @类方法
    def创建(cls,名称):
    blog=cls(name=name)
    #在您的示例中(来自Django文档),不重写create()。模型类中没有这样的方法

    ModelManager(查询)中有一个创建方法:


    在overrideen save方法中,只有在调用super().save()之前更改了对象,更改才会被保存。在super().save()之后,主要是关于反馈。但如果在此处引发异常,则将回滚保存。此外,您可能希望从super().save()捕获异常并对其进行处理

    模型上有
    save
    方法,但是
    create
    方法是为您创建对象的默认管理器,它执行一些验证,然后调用save方法。
    class Blog(models.Model):
        name = models.CharField(max_length=100)
        tagline = models.TextField()
    
        @classmethod
        def create(cls, name):
            blog = cls(name=name)
            # do something <-- 1!
            return blog
    
        def save(self, *args, **kwargs):
            # do_something <-- 2!
            super(Blog, self).save(*args, **kwargs) # Call the "real" save() method.
            # do_something_else <-- 3!