6

我正在使用marshmallow 2.0.0rc2 来验证 HTTP 请求的输入数据,并将 SQLAlchemy 模型加载到 HTTP 响应上的 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在加载时填充字段。我错过了什么或棉花糖不提供这样的功能吗?

4

1 回答 1

1

要强制加载无,您可以使用missing参数

missing – 如果在输入数据中未找到该字段,则该字段的默认反序列化值。可能是一个值或可调用的。

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

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

于 2016-06-01T09:30:07.793 回答