在加载时强制“无”并在转储时跳过“无”

时间:2015-09-23 13:20:49

标签: python marshmallow

我正在使用marshmallow 2.0.0rc2验证HTTP请求的输入数据,并在HTTP响应上将SQLAlchemy模型加载到JSON。我偶然发现了两个问题:

首先,在HTTP PUT请求中从JSON加载数据时,我想将所有缺少的字段填充为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 个答案:

答案 0 :(得分:1)

要在加载时强制为无,您可以使用missing parameter

  

missing - 如果在输入数据中找不到该字段,则该字段的默认反序列化值。可能是值或可赎回。

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

关于你的第二点,docs似乎说从2.0开始,缺失的字段被排除在序列化输出之外。