我正在从迁移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:忘了提:所有实体都有密钥,所以检查对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