尝试使用棉花糖使用data_key加载数据时“缺少数据”

时间:2019-02-18 10:27:58

标签: python python-3.x marshmallow

我尝试在 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字段中声明?

2 个答案:

答案 0 :(得分:0)

data_key是在棉花糖3中引入的。

请参见changelog entry

  

向后不兼容:将data_key参数添加到用于在输入和输出数据字典中指定键的字段。此参数替换load_fromdump_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)