我想创建一个合适的post_create(也是post_get和post_put)挂钩,类似于我在应用程序的数据库版本上的挂钩。Google App Engine NDB post_create挂钩
不幸的是我不能使用has_complete_key。
这个问题很有名:在模型中缺少is_saved。
现在我已经实现了它这样的:除了post_create钩
class NdbStuff(HooksInterface):
def __init__(self, *args, **kwds):
super(NdbStuff, self).__init__(*args, **kwds)
self._is_saved = False
def _put_async(self, post_hooks=True, **ctx_options):
""" Implementation of pre/post create hooks. """
if not self._is_saved:
self._pre_create_hook()
fut = super(NdbStuff, self)._put_async(**ctx_options)
if not self._is_saved:
fut._immediate_callbacks.insert(
0,
(
self._post_create_hook,
[fut],
{},
)
)
self._is_saved = True
if post_hooks is False:
fut._immediate_callbacks = []
return fut
put_async = _put_async
@classmethod
def _post_get_hook(cls, key, future):
obj = future.get_result()
if obj is not None:
obj._is_saved = True
cls._post_get(key, future)
def _post_put_hook(self, future):
if future.state == future.FINISHING:
self._is_saved = True
else:
self._is_saved = False
self._post_put(future)
一切似乎工作。
每次使用put_async时,都会触发post_create,而不先检索对象。
我真的很感谢关于如何在创建对象后触发post_create_hook一次的线索。
为什么不使用工厂来创建实体,并且在创建对象时将'_is_saved'显式设置为false。你甚至开始放之前。那么你不必尝试和__init__方法一起玩。 –
@TimHoffman你能更具体一点吗? 我已经_is_saved设置在init和右后类声明和非解决方案的工作。当put_async正在完成时,is_saved只是未更新为True – user2091046
请参阅下面的答案。 –