gpt4 book ai didi

python - 是否可以使用 NDB 确定模型是否在数据存储中持久存在?

转载 作者:太空狗 更新时间:2023-10-29 17:18:19 28 4
gpt4 key购买 nike

我正在从 db.Model 迁移到 ndb.Model。在完成此迁移之前我必须解决的唯一问题是没有 Model.is_saved 方法。我在我的应用程序中使用了 db.Model.is_saved 来确定分片计数器是否必须在 put/delete 上更新,以检查冲突的键关于创建实体等

文档说 ndb.Model 没有与 is_saved 方法等效的方法。我可以使用 get_or_insert 而不是 is_saved 重新实现一些用例。但不是全部。

作为一个肮脏的黑客,我可以为我通过调用构造函数创建的每个实例设置标志,如 _in_memory_instance。但这并不能解决我的问题。我仍然必须至少在每次 put() 调用后更新此标志。

问题是:是否有更好的方法来确定模型是否在数据存储中持久存在而不影响额外的数据存储?

编辑 1:忘记提及:所有实体都有 key ,因此检查 Model._has_complete_key() 对我不起作用。

编辑 2:讨论之后 https://groups.google.com/d/topic/google-appengine/Tm8NDWIvc70/discussion似乎解决我的问题的唯一方法是使用 _post_get_hook/_post_put_hook。我想知道为什么这么微不足道的东西没有包含在官方API中。

编辑 3:我最终为所有模型创建了下一个基类。现在我可以(几乎)保持我的代码库不变:

class BaseModel(ndb.Model):

@classmethod
def _post_get_hook(cls, key, future):
self = future.get_result()
if self:
self._is_saved = bool(key)

def _post_put_hook(self, future):
self._is_saved = future.state == future.FINISHING

def is_saved(self):
if self._has_complete_key():
return getattr(self, "_is_saved", False)
return False

最佳答案

要在 NDB 中获得相同类型的状态,您需要结合使用post-get-hook 和 post-put-hook 设置标志。这是一个工作示例:

class Employee(ndb.Model):
<properties here>

saved = False # class variable provides default value

@classmethod
def _post_get_hook(cls, key, future):
obj = future.get_result()
if obj is not None:
# test needed because post_get_hook is called even if get() fails!
obj.saved = True

def _post_put_hook(self, future):
self.saved = True

没有必要检查 future 的状态——当钩子(Hook)被调用, future 总是有结果的。这是因为hook 实际上是对 future 的回调。然而有必要检查它的结果是否为 None!

PS:在事务内部,一旦 put() 调用返回,就会调用 Hook ;交易的成败不影响他们。参见 https://developers.google.com/appengine/docs/python/ndb/contextclass#Context_call_on_commit在成功提交后运行 Hook 的方法。

关于python - 是否可以使用 NDB 确定模型是否在数据存储中持久存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12083254/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com