私はdb.Model
からndb.Model
に移行中です。この移行を完了する前に解決しなければならない唯一の問題は、Model.is_saved
メソッドがないことです。私は、ドキュメントがndb.Model
がis_saved
方法には相当していないことを言うなどのエンティティを作成する上で競合のキーをチェックするために、シャードのカウンタがput
/delete
に更新されなければならないかどうかを判断するために自分のアプリケーションにモデルがデータストア内で永続的であるかどうかをNDBで判断できますか?
をdb.Model.is_saved
を使用しています。 is_saved
ではなく、get_or_insert
のユースケースを再実装できます。しかし、それらのすべてではありません。
汚れたハックとして、私はコンストラクタを呼び出して作成したすべてのインスタンスに対して_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
オブジェクトに実際にキー/ IDがあるかどうかを確認できますか? (おそらくtry/except節で)。 NDBモデルクラスに精通していませんが、db.Modelがエラーを発生させることを思い出します(またはNone?)保存する前にモデルインスタンスのid/keyを取得しようとすると(またはおそらく 'None'を返します)。データストアのヒットで終わるとは思わないでください。それがうまくいけば、 'def is_saved(self):return self.key()is None'のようなプロパティを書くことができます(あるいは、例外が発生した場合にTrueを返すtry/except節で行います。 )。 –
キーを作成している場合、キーを確認することはできません。 1つの可能性のある代替案(ただし不十分かもしれない)には、creation_dateフラグ(auto_now_add = Trueに設定)があります。ドキュメントから "エンティティが書き込まれるまで自動値は生成されません;つまり、これらのオプションは動的なデフォルトを提供しません。"しかし、書き込みに失敗すると、その値が設定されます。書き込みが失敗したことを知っておくべきですが、 –
は_post_put_hookを使用して、保存されたことを示すフラグを設定します。 –