覆盖Google App Engine中的save,put,get等方法

时间:2010-05-02 06:02:34

标签: google-app-engine override

是否可以在Google App Engine中覆盖db.Model的方法? 我想声明beforeSave,afterSave方法等,以创建自动标记系统。

我知道有钩子,但在我看来解决这个问题是错误的方法:)

谢谢!

3 个答案:

答案 0 :(得分:13)

是的,可以覆盖这些方法。看看这个blog post by Nick Johnson。钩子模型类看起来像这样:

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"感兴趣。

答案 1 :(得分:1)

我发布了jbochi的HookedModel类的扩展,以便在before_putafter_put函数系列调用时正确调用db.put()_async方法。

请参阅AppEngine PreCall API hooks

答案 2 :(得分:1)

我试图改进@jbochi的答案:

  1. 根据https://developers.google.com/appengine/docs/python/datastore/modelclass#Model_putput()应该返回Key,因此应该传递库中的返回值。
  2. db.Model.save()虽然已被弃用,但(a)有时仍然使用,(b)意味着put()的同义词,(c)显然不是put()直接调用的 - 所以应该手动处理。
  3. 修订代码:

    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
    

    如果您希望使用monkeypatching或Chris Farmiloe的答案来使用异步方法,您仍应阅读http://blog.notdot.net/2010/04/Pre--and-post--put-hooks-for-Datastore-models