2010-05-02 46 views

回答

13

是的,可以重寫這些方法。看看這個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"

+5

我真的必須加快步伐。 ;) – 2010-05-02 15:29:44

+0

put()應該返回一個鍵 - 我已經提交了一個編輯來解決這個問題。 – wodow 2014-02-11 13:20:10

+0

@wodow,你不能編輯別人的代碼來添加自己的代碼,*尤其是如果它是被接受的答案*。如果你真的覺得自己有什麼需要添加的東西,那麼可以添加自己的答案,或者讓答案作者調整他們的代碼。我已經回滾你的編輯。 – Sheridan 2014-02-11 13:24:51

1

我發佈的擴展,jbochi的HookedModel類,以便從db.put()叫和_async家庭的功能,當before_putafter_put方法正確調用。

AppEngine PreCall API hooks

1

我已經嘗試了辦法由@jbochi改善:

  1. https://developers.google.com/appengine/docs/python/datastore/modelclass#Model_putput()應返回Key,所以從圖書館返回值應經之地。
  2. 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的回答中使用的異步方法。