Я перемещаюсь от 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.
Edit 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