это не мешает кому-то обновить банан до невозможного состояния.
Хранилище данных обеспечивает практически нулевое применение схемы самостоятельно.
Вы можете открыть веб-консоль для своего хранилища данных (https://console.cloud.google.com/datastore/entities), выбрать объект и начать удалять из него свойства, даже если при определении ndb
код имеет required=True
свойство

На рисунке я мог бы изменить поле completed
, чтобы оно было логическим вместо даты-времени, а затем appengine бросил бы исключение каждый раз, когда эта сущность выбирается через ndb
.
Так что я не знаю, где это вас покидает. Вы можете go __init__
маршрут
Вы можете поставить чек в _pre_put_hook
:
class Banana(ndb.Model):
is_delicious = ndb.BooleanProperty(default=True)
is_rotten = ndb.BooleanProperty(default=False)
def _pre_put_hook(self):
if self.is_delicious and self.is_rotten:
raise Exception("A rotten Banana entry cannot be delicious")
Вы можете сделать ComputedProperty
проверку:
class Banana(ndb.Model):
is_delicious = ndb.BooleanProperty(default=True)
is_rotten = ndb.BooleanProperty(default=False)
def _is_valid(self):
if self.is_delicious and self.is_rotten:
raise Exception("A rotten Banana entry cannot be delicious")
return True
is_valid = ndb.ComputedProperty(lambda self: self._is_valid())
Но все это будет работать только при доступе к БД по вашему ndb
коду