我正在使用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
填充字段。我错过了什么或棉花糖不提供这样的功能?
答案 0 :(得分:1)
要在加载时强制为无,您可以使用missing
parameter:
missing - 如果在输入数据中找不到该字段,则该字段的默认反序列化值。可能是值或可赎回。
class ExampleSchema(Schema):
field_a = fields.Int(missing=None)
关于你的第二点,docs似乎说从2.0开始,缺失的字段被排除在序列化输出之外。