Google Datastore NDB проверяет необязательный IntegerProperty - PullRequest
0 голосов
/ 26 ноября 2018

Как вы проверяете пустую строку поля формы '', чтобы назначить None для IntegerProperty?

class MyIntegerProperty(ndb.IntegerProperty):
    def _validate(self, value):
        if isinstance(value, basestring):
            if len(value) == 0 and self._required is False:
                return ?????????????????
            try:
                value = int(value)
            except ValueError:
                raise BadValueError(u'{0} must be a valid ' 
                    'integer'.format(self._name))
        if value < 0:
            raise BadValueError(u'{0} must be ' 
                'positive'.format(self._name))
        return value

class Account(ndb.Model):
    posint = MyIntegerProperty()

Документы говорят :

Вещичто _validate (), _to_base_type () и _from_base_type () не должны обрабатывать:

Нет: они не будут вызываться с None (и если они возвращают None, это означает, что значение не нуждается в преобразовании).

Что я сейчас делаю, это ручная обработка дела:

if len(request.form[name]) == 0:
    delattr(entity, name)
else:
    setattr(entity, name, request.form[name])

может ли он быть умнее этого?

1 Ответ

0 голосов
/ 27 ноября 2018

Валидатор может либо создать значение свойства, либо выдать исключение, предотвращая сохранение объекта.Из таблицы свойств таблица:

Будет вызываться с аргументами (prop, value) и должна либо возвратить (возможно, принудительное) значение, либо вызватьисключение.Повторный вызов функции для принудительного значения не должен дополнительно изменять значение.(Например, возвращение value.strip () или value.lower () возможно, но не value + '$' .) Может также вернуть Нет , что означает «без изменений».См. Также Запись подклассов свойств

Но ничего из вышеперечисленного не является тем, что вы на самом деле хотите, а именно - удалить свойство.Обратите внимание, что:

  • установка значения свойства None (что может привести к ошибке, например, для IntegerProperty) - это не то же самое, что удаление свойства (совершенно нормально для * 1026)*)
  • установка значения свойства None при использовании валидатора может быть сложной задачей, так как возврат None из валидатора означает no change.

Так что я верю вам 'Вам придется сохранить текущую обработку для этого случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...