Как я могу проверить свойства через Google appengine ndb? - PullRequest
3 голосов
/ 09 января 2020

Скажем, у меня есть класс с двумя свойствами:

class Banana(ndb.Model):
    is_delicious = ndb.BooleanProperty(default=True)
    is_rotten = ndb.BooleanProperty(default=False)

Гнилая запись Banana не может быть вкусной. Как я могу предотвратить сохранение деликатного, гнилого банана в хранилище данных?

Я могу переопределить метод __init__, как в этот ответ , но это не мешает кому-то обновление банан в невозможном состоянии.

В документах показана опция проверки , но она не работает в разных полях.

Как проверить два поля моего модели друг против друга, чтобы предотвратить сохранение объекта в неправильном состоянии?

1 Ответ

3 голосов
/ 09 января 2020

это не мешает кому-то обновить банан до невозможного состояния.

Хранилище данных обеспечивает практически нулевое применение схемы самостоятельно.

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

enter image description here

На рисунке я мог бы изменить поле 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 коду

...