我在项目中有一些模型(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
问题是它是否可能,如果可能,我该怎么做?
答案 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