2015-09-23 4 views
5

Я использую marshmallow 2.0.0rc2 для проверки входных данных по HTTP-запросам и загрузки моделей SQLAlchemy в JSON по ответам HTTP. И я наткнулся на 2 проблемы:Принуждение `None` при загрузке и пропуске` None` на дампе

Во-первых, загружая данные из JSON по запросу HTTP PUT, я хочу заполнить все отсутствующие поля как None, чтобы правильно перезаписать данные в SQLAlchemy. Сейчас я использую следующий код:

for name, field in schema.fields.iteritems(): 
    if field.missing == ma.missing: 
     schema.fields[name].missing = None 

Это работает, но я полагаю, что это прослушивается, так как я буду баловаться с marshmallow.Field например, прикрепленными к Schema классу. И после удаления Schema экземпляра все поля, которые мы исправили, будут застревать с новым отсутствующим, а не по умолчанию.

Во-вторых, при сбрасывании данных из SQLAlchemy в JSON все отсутствующие поля разрешены как None, а JSON заполняется данными {"key": null, }. Это нежелательное поведение, и я очищаю их по триггеру post_dump.

@post_dump 
def clean_missing(self, data): 
    for key in filter(lambda key: data[key] is None, data): 
     data.pop(key) 
    return data 

То же, что и предыдущий, он работает, но включает в себя создание некоторой BaseSchema класса ведьму передает эту логику для всех унаследованных классов.

Я искал документацию и не нашел правильного способа поменять это поведение, т. Е. Пропускает поля при сбросе и заполнении полей None при загрузке. Я что-то упускаю, или зефир не предоставляет таких функций?

ответ

1

Чтобы принудительно None при загрузке, вы можете использовать missing parameter:

отсутствует - значение по умолчанию для десериализации поля, если поле не найдено во входных данных. Может быть значением или вызываемым.

class ExampleSchema(Schema): 
    field_a = fields.Int(missing=None) 

Что касается вашего второго пункта, то docs, кажется, говорит, что от 2,0 на недостающие поля исключены из сериализованного производства.

Смежные вопросы