我有一个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"
但是,如果有效的属性发生了更改,请说从False
到True
,我不希望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
是否有办法访问属性的上一个值,以便我可以选择是否触发外部函数?
答案 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模型的问题,因为该属性将写入数据存储区。