Как получить грязные факторы модели NDB в pre_put_hook
Можно ли изобразить грязные факторы сущности в pre_put_hook
?
Я хочу условно выполнить некоторые обратные вызовы в зависимости от того, что происходит put
, Например, если у объекта изменилось определенное свойство, я хочу отправить уведомление по электронной почте. Я могу сделать это вручную перед звонком put()
но если метод не удается, то put()
тоже не звонят.
3 ответа
Следуя предложению Брайана М. Ханта, я проверяю грязные факторы, используя следующий код. В этом случае я проверяю свойство под названием status
:
class Blog(ndb.Model):
status = ndb.IntegerProperty(default=0)
def __init__(self, *args, **kwargs):
# make sure the __old_status__ exists when you `new' an object
# instead of getting it from DataStore. e.g. b = Blog(status=1)
super(Blog, self).__init__(*args, **kwargs)
self.__old_status__ = self.status # I check the status only
@classmethod
def _post_get_hook(cls, key, future):
obj = future.get_result()
setattr(obj, '__old_status__', obj.status)
def _pre_put_hook(self):
if (not self.key.id() or self.__old_status__ != self.status) and (self.status == 1):
# the blog is (either a new blog or an existing blog) AND its status is changed to published (e.g. value = 1)
# do sth e.g. save the time when it is published, update FB object cache and etc.
pass
Вы можете сделать это, определив на ndb.Model
_post_get_hook
и _pre_put_hook
соответственно сохраните первоначальное значение свойства и сравните его с оригинальным.