Django:重写create()方法和save方法()有什么区别?

时间:2014-02-23 03:57:51

标签: python django django-models

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

如果我理解这一点,create()方法只是save()方法的包装器。我已经看到了压倒一切行为的例子......

  1. in the create() method
  2. in the save() method在调用真正的save()方法之前,
  3. 调用真正的save()方法后,
  4. and in the save() method
  5. 有什么区别?


    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!
    

1 个答案:

答案 0 :(得分:2)

在您的示例中(来自Django文档),create()是而不是覆盖。 Model类中没有这样的方法。

ModelManager中有一个create方法(查询):https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.create

在覆盖保存方法中,只有在调用super()。save()之前更改对象时,才会保存更改。在super()。save()之后,它主要是关于反馈。但如果您在此处引发异常,则会回滚保存。此外,您可能希望从super()。save()捕获异常并对其执行某些操作。