Получить None из данных Fields вместо пустой строки

У меня есть это поле в форме WTForms

name = StringField('Name', validators = [Optional(), Length(max = 100)])

Когда поле отправлено пустым, тогда form.name.data, как и ожидалось, будет содержать пустую строку.

Есть ли способ заставить его возвращать None вместо пустой строки? Просто потому, что очень удобно иметь дело с null в БД вот так update:

update t
set 
    name = coalesce(%(name)s, name),
    other = coalesce(%(other)s, other)

С приведенным выше кодом мне не нужно проверять, пусто поле или нет, и предпринимать соответствующие действия, будь то в коде Python или в коде SQL. null с coalesce решает эту проблему легко.


person Clodoaldo Neto    schedule 17.02.2014    source источник
comment
Я бы сказал, что это сомнительно, так как фактические данные, полученные от браузера, действительно будут содержать пустую строку для этого поля. Что не так с проверкой значений полей и заменой пустых строк на None самостоятельно? Например. whatever_database.insert_record(form.name.data or None, form.other.data or None)   -  person lanzz    schedule 17.02.2014
comment
@lanzz Что не так с... Ничего особенного. Просто я думаю, что будет чище оставить эту логику там, где (ИМО) она принадлежит; процессор форм   -  person Clodoaldo Neto    schedule 17.02.2014
comment
@lanzz Если бы у WTForms была возможность автоматически перезаписывать данные формы.... Действительно так. Проверьте мой ответ.   -  person Clodoaldo Neto    schedule 18.02.2014
comment
Интересно, что если данные формы поступают из JSON POST (а не из HTML-формы), то отсутствующий ключ приведет к пустой строке из файла StringField. Это нелогично, IMO, так как это означает, что нет способа различить «пользователь не ввел значение для этого поля» и «пользователь отправил пустую строку», которые могут иметь очень разную семантику в приложении (в моем случае это так). ).   -  person jscn    schedule 25.10.2017


Ответы (1)


В конструкторе Field есть параметр filters.

name = StringField(
    'Name', 
    validators = [Optional(), Length(max = 100)], 
    filters = [lambda x: x or None]
)

http://wtforms.readthedocs.org/en/latest/fields.html#the-field-base-class

person Clodoaldo Neto    schedule 18.02.2014