更改保存或将函数放入数据库orms中

时间:2013-06-21 16:51:16

标签: database django google-app-engine orm

我在处理数据库时已经注意到了一些事情,特别是处理数据库的python ORM。

以下是django中save()函数的示例:

def save(self, **kwargs):
    self.somevar = dosomething(self.someothervar)
    return super(<Your_Model_Here>, self).save()

此外,在谷歌应用引擎中,使用函数put()

def put(self, **kwargs):
    self.<some_var> = doSomething(self.someOtherVar)
    return super(<Entity>, self).save()

现在,我理解为什么我们这样做,IIRC,我们这样做是因为我们没有手动编写put()save()函数,所以我们需要使用super调用来正常运行

有人可以给我一个更详细的解释,说明为什么保存功能是这样的。我对它的理解是错误的,因为我通过进入和编码来学习,但我真的不(明确地)理解当我写save()put()函数时发生了什么。

1 个答案:

答案 0 :(得分:1)

您正在目睹在子类中重写的方法。子类化的目的是根据需要重用代码并覆盖功能。有时,这涉及覆盖方法并调用其父级的部分。

super调用父类的方法。

这与完全不进行子类化完全相同:

def save(...):
   return super(MyClass, self).save(...)

相反,如果我们只编写一个没有超级调用的方法,它将完全替换父类方法功能。

def save(...):
   print ("I have nothing to do with my parent class")

如果我们想要补充功能(即保留旧的行为但添加额外的东西),我们使用super从新方法中调用原始方法。

def save(...):
   print ("I am called directly before the original parent method")
   return super(MyClass, self).save(...)