覆盖另一个类中的save方法

时间:2016-05-23 13:11:02

标签: python django

我在项目中有一些模型(modelA,modelB,modelC),我想在每个模型中覆盖save方法,因此它具有适用于所有模型的功能。

所以我为模型做了类似的事情:

class modelA(CustomClass, models.Model):
    ......

class CustomClass():
    def save(self, *args, **kwargs):
        # do something
        # and now I want to call modelA.save() method
        super(modelA, self).save(*args, **kwargs)
        # super is used here as example

问题是它是否可能,如果可能,我该怎么做?

3 个答案:

答案 0 :(得分:2)

是的,只需在自定义类中定义save方法,并确保在进一步覆盖save方法时调用基本方法。

默认情况下,模型使用models.Model implementation of save。当你打电话给超级(通过super(CustomClass, self)..)时,你将调用通常的保存行为。

注意上面的内容取决于继承自我最初认为它正在做的Model的自定义类的modelA。

class modelA(CustomClass):
    ......

class CustomClass(models.Model):
    ....

答案 1 :(得分:0)

class CustomClass(models.Model):

    def save(self, *args, **kwargs):
        # do things needed generally 2.)
        super(CustomClass, self).save(*args, **kwargs)


class ModelA(CustomClass):

    def save(self, *args, **kwargs):
        # do things specific for ModelA 1.)
        super(ModelA, self).save(*args, **kwargs)
        # do things specific for ModelA 3.)
括号前的

数字表示保存 ModelA

时的执行顺序

答案 2 :(得分:0)

我倾向于使用mixins(基于组合的多重继承)这样的情况,但这是你的电话。它可以像声明一个继承自CustomSaveMixin的{​​{1}}类一样简单,只需要object覆盖。这将允许您为不需要覆盖的方法保留基础save子类。例如:

Model

但是,我没有尝试过这种方法(继承class CustomSaveMixin(object): def save(self, *args, **kwargs): # ... # If you're preserving existing Django save hooks (most likely). super(CustomSaveMixin, self).save(*args, **kwargs) class ExampleModel(models.Model, CustomSaveMixin): # ... ),但我知道它适用于基于类的视图。官方文档建议声明一个扩展object的mixin类,但我会尝试这两种方法。 https://docs.djangoproject.com/en/1.9/topics/db/models/#multiple-inheritance