2016-05-23 51 views
0

我在项目中有几个模型(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

'CustomClass'应该是模型类型之间的普通类吗? – Sayse

回答

2

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

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


注意上述取决于MODELA从从我最初以为是在做模型继承自定义的类继承..

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

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

也想到了这一点,我认为在CustomClass.save中执行诸如models.Model.save(self,args,kwargs)也是适用的解决方案 –

+0

@ user3581394 - 无论如何,通过调用基类的方法来做到这一点。 – Sayse

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

0

我倾向于在这种情况下使用mixins(基于组合的多重继承),但它是你的呼叫。这可以像声明从object继承的CustomSaveMixin类一样简单,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),但我知道它的工作原理基于类的观点。官方文档建议声明扩展models.Model的mixin类,但我会尝试这两种方法。 https://docs.djangoproject.com/en/1.9/topics/db/models/#multiple-inheritance