我尝试在 python 3.7 上使用棉花糖2.18.0 来验证数据。我在等待json {'name': 'foo', 'emailAddress': 'x@x.org'}
并使用架构加载它:
class FooLoad(Schema):
name = fields.Str()
email = fields.Email(data_key='emailAddress', required=True)
除了在 load 上的 data_key 会返回给我类似{'name': 'foo', 'email': 'x@x.org'}
的信息外,我在错误字段中出错:
schema_load = FooLoad()
after_load = schema_load.load({'name': 'foo', 'emailAddress': 'x@x.org'})
after_load.errors # return {'email': ['Missing data for required field.']}
但是根据marshmallow docs中带有 devDependencies 或github issue的示例, after_load 必须包含{'name': 'foo', 'email': 'x@x.org'}
之类的数据。
我想反序列化传入日期的名称与架构属性名称不同(指定 date_key 所需的名称),但是尝试时出现错误。我该如何反序列化输入数据的名称,该名称与模式属性不同,并且在该属性的data_key字段中声明?
答案 0 :(得分:0)
data_key
是在棉花糖3中引入的。
请参见changelog entry:
向后不兼容:将
data_key
参数添加到用于在输入和输出数据字典中指定键的字段。此参数替换load_from
和dump_to
(#717)。
和关联的pull-request。
使用棉花糖2时,必须使用load_from
/ dump_to
:
class FooLoad(Schema):
name = fields.Str()
email = fields.Email(load_from='emailAddress', dump_to='emailAddress', required=True)
您正在使用棉花糖2,但正在阅读棉花糖3的文档。
请注意,棉花糖3包含许多改进,处于RC状态,因此,如果您开始一个项目,则可以选择棉花糖3,并在以后节省一些过渡工作。
答案 1 :(得分:0)
我也遇到同样的现象,试图解析API响应。事实证明,尽管我需要比我更早地对响应进行更深入的研究。
答复为:
{
"meta": {
"status": 200,
"message": null
},
"response": {
"ownerId": "…",
"otherData": […]
}
}
然后我打电话:
MySchema().load(response.json())
…
class MySchema(Schema):
owner_id = fields.String(data_key='ownerId')
…
Meta:
unknown = INCLUDE
@post_load
def load_my_object(self, data, **kwargs):
inner = data.get('response', data)
return MyObject(**inner)
但实际上应该是:
inner = data.get('response', data)
return MySchema().load(inner)
…
class MySchema(Schema):
owner_id = fields.String(data_key='ownerId')
…
Meta:
unknown = INCLUDE
@post_load
def load_my_object(self, data, **kwargs):
return MyObject(**data)