Override save, put, get, etc... methods in Google App Engine
Is it possible to override methids for db.Model in Google App Engine? I want to declare beforeSave, afterSave methods, etc.. to create automatic tagging system.
I know there are hooks, but it seems to me a wrong way to sol开发者_StackOverflow中文版ve this issue :)
Thanks!
Yes, it's possible to override these methods. Have a look at this blog post by Nick Johnson.The hooked model class looks this:
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()
Read the blog to see how to handle the db.put()
method too.
You might also be interested on "derived properties".
I posted an extension to jbochi's HookedModel class so that the before_put
and after_put
methods are correctly invoked when called from db.put()
and the _async
family of functions.
See AppEngine PreCall API hooks
I've attempted to improve upon the answer by @jbochi:
- According to https://developers.google.com/appengine/docs/python/datastore/modelclass#Model_put ,
put()
should return aKey
, so the return value from the library should be passed through. db.Model.save()
, while deprecated, is (a) sometimes still used, (b) meant to be a synonym forput()
and (c) apparently not called directly byput()
- so should be handled manually.
Revised code:
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
You should still read http://blog.notdot.net/2010/04/Pre--and-post--put-hooks-for-Datastore-models if you wish to use the monkeypatching, or Chris Farmiloe's answer for use of the async methods.
精彩评论