2014-02-23 56 views
0

我想重写一些模型行为,但我不确定应该在哪里做。Django:重写create()方法和save方法()之间有什么区别?

如果我理解这个权利,create()方法只是save()方法的包装。我见过的压倒一切的行为的例子......

  1. in the create() method
  2. in the save() method调用真正的save()方法,
  3. and in the save() method调用真正的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! 
+1

'save'方法在模型上,但'create'方法是为您创建对象的默认管理器,它执行一些验证,然后调用save方法。 – karthikr

回答

2

在您的例子(从Django文档)创建()是覆盖。 Model类中没有这样的方法。

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

在overrideen保存方法,只有当你调用超级前更改对象()保存,更改将被保存。在super()。save()之后,它主要是反馈。但是,如果您在此处引发异常,保存将会回滚。另外,你可能想要从super()。save()中捕获一个Exception并且做一些事情。

相关问题