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