在django代理模型中重写save方法

在django代理模型中重写save方法,django,Django,我正在使用第三方应用程序,我希望覆盖原始模型的save()方法来验证一些数据 class CustomState(State): class Meta: proxy = True def save(self, *args, **kwargs): print('hellooo in save method of state') super(State, self).save(*args, **kwargs) 但是,上面的代码段不会

我正在使用第三方应用程序,我希望覆盖原始模型的save()方法来验证一些数据

class CustomState(State):
    class Meta:
        proxy = True

    def save(self, *args, **kwargs):
        print('hellooo in save method of state')
        super(State, self).save(*args, **kwargs)
但是,上面的代码段不会运行


因此,我的问题是有没有一种方法可以覆盖模型的save方法?或者如果不可能,是否有办法在创建第三方模型实例之前添加验证?

问题与您的模型是代理这一事实无关,而是与调用父级的错误方式有关
super().save()


请看本教程的主题

代理模型不会覆盖原始模型的任何内容。代理模型“使用原始”表,并“附加不同的行为”。如果你这样做了一个
CustomState().save()
,那么它将触发这个
.save()
方法。但是,模型创建是在第三方应用程序中进行的。我不想修补它,有没有办法在保存第三方模型时修改其行为?除非您使用monkey patching(),否则没有,而且这也有点冒险和不合法。如果您使用的是Python3,那么您不需要super()的参数,除非您做得非常聪明。
class CustomState(State):
    class Meta:
        proxy = True

    def save(self, *args, **kwargs):
        print('hellooo in save method of state')

        # The wrong way to call super
        # super(State, self).save(*args, **kwargs)

        super(CustomState, self).save(*args, **kwargs)