【问题标题】:Selectively triggering a model _post_put_hook选择性触发模型_post_put_hook
【发布时间】:2016-01-12 06:31:39
【问题描述】:

我在 ndb 模型上设置了一个 _post_put_hook 来更新一些搜索索引。这简化了数据导入和原子更新。 但是我有一种情况,我想在不触发索引操作的情况下更新该模型的某些属性。

所以我正在寻找:

  1. 可以与 _post_put_hook 一起使用的某种标志,或者:
  2. 一种了解 put() 上哪些模型属性/值已更改的方法,因此我可以添加条件来更新索引。

谢谢!

【问题讨论】:

  • 更难的部分是监视属性以查看它们是否已更改。因为ndb.Model 基类中没有内置这样的方法。数据存储在_values
  • 你可以,只是不能直接使用钩子,但它们会有所帮助。使用更高级别的 get to then 来制作属性的副本,同时创建它们的哈希值。在 _pre_put 然后比较哈希,如果不同,则查找更改,在我们的例子中,存储子实体中更改的审计跟踪以及谁做了这些。

标签: google-app-engine google-cloud-datastore app-engine-ndb google-app-engine-python


【解决方案1】:

一种方法是设置一个不是 ndb.Property(即 volatile)的实体属性,当您想避免调用 _post_put_hook 中的逻辑时,您明确设置该属性。

例如

来自我的 zope days 属性,这些属性不会保存在名为 _v_somename 的位置

如此明确地setattr(self,_v_no_hook,True) - 显然在方法中这样做;-)

然后只需检查 _post_put_hook 中的标志

if not getattr(self,'_v_no_hook`,False):
     # do something.not  

您可以使用 post put 钩子来做到这一点,因为它们是方法,而不是大多数其他钩子的类方法。

【讨论】:

  • 谢谢蒂姆!将使用这种方法。
猜你喜欢
  • 1970-01-01
  • 2012-11-20
  • 2014-12-28
  • 2021-08-07
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
相关资源
最近更新 更多