Я никогда не видел этого раньше, Google, похоже, не предлагал здесь особой помощи, извиняюсь, если название нечеткое, не знал, как назвать эту проблему.
Я перехожу сот ext.db к ndb, и некоторые логики в моих моделях используют функцию ext.db is_saved()
. документация по миграции отправляет меня на этот SO вопрос , который говорит мне, что я могу установить свойство по умолчанию, например is_saved
, на False
, установить некоторые перехваты post / get, которые меняют егона True
и я получу ту же функциональность.
Итак, у меня есть модель Workout:
class Workout(ndb.Expando):
..properties..
is_saved = False
def __init__(self, parent=None, **kwds):
self._summary = None
self._description = None
self._snapshots = kwds.get('_snapshots')
self._action = kwds.get('_action')
self._record_id = kwds.get('_record_id')
self._packageNumber = None
super(Workout, self).__init__(parent=None, **kwds)
@classmethod
def _post_get_hook(cls, key, future):
obj = future.get_result()
if obj is not None:
# test needed because post_get_hook is called even if get() fails!
obj.is_saved = True
def _post_put_hook(self, future):
logging.info(future)
self.is_saved = True
Другая логика в моей кодовой базе в конечном итоге сохраняет (или put()
ing) сущность, и я в конечном итоге сохраню переменную workout
сущности:
>>> workout
Workout(key=Key('Workout', 5132107961597952), calories=2.0, creation_date=datetime.datetime(2018, 8, 24, 18, 23, 0, 769000), distance=1.0, elapsedSeconds=21600, is_deleted=False, is_saved=True)
Отлично, is_saved
равно True
, логика работает.Доступ к нему, хотя,
>>> workout.is_saved
False
Хорошо, что, если я сам установлю это:
>>> workout.is_saved = True
>>> workout.is_saved
False
Ну, это противоречит всей логике и разуму.Может быть, это объект?
>>> workout.calories = 0.555
>>> workout.calories
0.555
Хорошо, не проблема с объектом.Понятия не имею, что здесь не так.