当使用实体列表调用db.put()时,是否为每个实体调用了特定于模型的put()?

时间:2011-02-18 11:39:09

标签: python google-app-engine bigtable

我的GAE应用程序上有一些模型,我在其中一些应用程序上覆盖了put()。当我使用这些实体列表调用db.put()时,是否可以保证每个实体上的覆盖put()都会被调用?

我现在看到的是,实体只是在没有被调用的情况下得到保存。有没有什么好方法可以确保在每次保存之前完成任务,甚至是批次?

2 个答案:

答案 0 :(得分:3)

没有。您也需要monkeypatch db.put()。有关这方面的一个很好的例子,请查看Nick Johnson在Pre- and post- put hooks for Datastore models上发表的优秀博文。

如果查看db模块的源代码,您会发现db.put()没有调用实体的put()函数。

答案 1 :(得分:0)

您可以尝试以下方式:

class SomeModel(db.Model):
    aprop = db.IntegerProperty()

    def _populate_internal_entity(self, *args, **kwargs):
        logging.warn('about to Put() SomeModel: %r', self)
        return super(SomeModel, self)._populate_internal_entity(*args, **kwargs)

然而,可能有更好的方法。如果您尝试设置某些属性,则应检查自定义属性类。如果您尝试进行日志记录或缓存,则应调查数据存储区挂钩。