你能在_pre_put_hook中访问ndb属性的先前值吗?

时间:2018-01-31 10:57:51

标签: python-2.7 google-app-engine app-engine-ndb

我有一个ndb模型如下:

class SomeModel(ndb.Model):     
    name = ndb.StringProperty(default="")
    valid = ndb.BooleanProperty(default=False)

def some_function():
    print "fired"

当name属性从以前更改时,我希望some_function()函数触发。

e.g。

$ q = SomeModel.query().get()
$ print p.name 
John
$ q.name = "Sam"
$ q.put()
"fired"

但是,如果有效的属性发生了更改,请说从FalseTrue,我不希望some_function()触发。

e.g。

$ q = SomeModel.query().get()
$ print p.name
Sam
$ print p.valid 
False
$ q.valid = True
$ q.put()

使用_post_put_hook_pre_put_hook是否有办法访问属性的上一个值,以便我可以选择是否触发外部函数?

1 个答案:

答案 0 :(得分:2)

这种做法对我来说似乎总是有些苛刻,但似乎有效。

您可以在_post_get_hook的实例上存储属性值,并在_pre_put_hook(或_post_put_hook)中检索它们:

class Foo(ndb.Model):

    ...

    @classmethod
    def _post_get_hook(cls, key, future):
        instance = future.get_result()
        if instance:
            # Store 'old' instance data as an instance attribute
            instance._before = instance.to_dict()

    def _pre_put_hook(self):
        # Check if our storage attribute exists,
        # this could be a new instance.
        if hasattr(self, '_before'):
            # Do something with 'before' data
            ...
            # clean up
            del self._before 

编辑:

清理 - 如果要多次调用对象上的put,可能需要考虑删除存储属性。对于标准模型,您可以保留属性,但这可能是Expando模型的问题,因为该属性将写入数据存储区。