是否可以在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