是否可以在Google App Engine中覆盖db.Model的方法? 我想声明beforeSave,afterSave方法等,以创建自动标记系统。
我知道有钩子,但在我看来解决这个问题是错误的方法:)
谢谢!
答案 0 :(得分:13)
是的,可以覆盖这些方法。看看这个blog post by Nick Johnson。钩子模型类看起来像这样:
class HookedModel(db.Model):
def before_put(self):
pass
def after_put(self):
pass
def put(self, **kwargs):
self.before_put()
super(HookedModel, self).put(**kwargs)
self.after_put()
阅读博客,了解如何处理db.put()
方法。
您可能也对"derived properties"感兴趣。
答案 1 :(得分:1)
我发布了jbochi的HookedModel类的扩展,以便在before_put
和after_put
函数系列调用时正确调用db.put()
和_async
方法。
答案 2 :(得分:1)
我试图改进@jbochi的答案:
put()
应该返回Key
,因此应该传递库中的返回值。db.Model.save()
虽然已被弃用,但(a)有时仍然使用,(b)意味着put()
的同义词,(c)显然不是put()
直接调用的 - 所以应该手动处理。修订代码:
class HookedModel(db.Model):
def before_put(self):
pass
def after_put(self):
pass
def put(self, **kwargs):
self.before_put()
result = super(HookedModel, self).put(**kwargs)
self.after_put()
return result
def save(self, **kwargs):
self.before_put()
result = super(HookedModel, self).save(**kwargs)
self.after_put()
return result
如果您希望使用monkeypatching或Chris Farmiloe的答案来使用异步方法,您仍应阅读http://blog.notdot.net/2010/04/Pre--and-post--put-hooks-for-Datastore-models。