2010-05-02 48 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的回答中使用的异步方法。