Как мога да проверявам между собствености с помощта на Google appengine ndb?

Да кажем, че имам клас с две свойства като:

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

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

Мога да отменя метода __init__ както в този отговор, но това не пречи на някой да актуализира банан до невъзможно състояние.

Документите показват опция за валидатор но това не работи в различни области.

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


person YPCrumble    schedule 09.01.2020    source източник


Отговори (1)


това не пречи на някой да актуализира банана до невъзможно състояние.

Datastore осигурява почти нулево прилагане на схемата само по себе си.

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

въведете описание на изображението тук

На снимката бих могъл да редактирам полето completed, за да бъде булево вместо дата-час и тогава appengine ще хвърля изключение всеки път, когато този обект бъде извлечен чрез ndb.

Така че не знам къде те оставя това. Можете да отидете по маршрута __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())

Но всички те ще работят само когато db е достъпен от вашия ndb код

person Alex    schedule 09.01.2020