是否可以在Google App Engine中重写db.Model的方法? 我想申报beforeSave,afterSave方法等等来创建自动标记系统。覆盖Google App Engine中的保存,放入,获取等...方法
我知道有挂钩,但在我看来,一个错误的方式来解决这个问题:)
谢谢!
是否可以在Google App Engine中重写db.Model的方法? 我想申报beforeSave,afterSave方法等等来创建自动标记系统。覆盖Google App Engine中的保存,放入,获取等...方法
我知道有挂钩,但在我看来,一个错误的方式来解决这个问题:)
谢谢!
是的,可以重写这些方法。看看这个blog post by Nick Johnson .The迷上模型类如下这样:
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"。
我发布的扩展,jbochi的HookedModel类,以便从db.put()
叫和_async
家庭的功能,当before_put
和after_put
方法正确调用。
我已经尝试了办法由@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
你应该也看http://blog.notdot.net/2010/04/Pre--and-post--put-hooks-for-Datastore-models,如果你想使用的monkeypatching,或克里斯Farmiloe的回答中使用的异步方法。
我真的必须加快步伐。 ;) – 2010-05-02 15:29:44
put()应该返回一个键 - 我已经提交了一个编辑来解决这个问题。 – wodow 2014-02-11 13:20:10
@wodow,你不能编辑别人的代码来添加自己的代码,*尤其是如果它是被接受的答案*。如果你真的觉得自己有什么需要添加的东西,那么可以添加自己的答案,或者让答案作者调整他们的代码。我已经回滚你的编辑。 – Sheridan 2014-02-11 13:24:51