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