'Missing data' 当尝试使用棉花糖 data_key 加载数据时

'Missing data' when try to load data with data_key using marshmallow

我尝试在 python 3.7 上使用 marshmallow 2.18.0 来验证数据。我在等待 json {'name': 'foo', 'emailAddress': 'x@x.org'} 并使用架构加载它:

class FooLoad(Schema):
    name = fields.Str()
    email = fields.Email(data_key='emailAddress', required=True)

我除了 data_keyload 上会 return 我有点像 {'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 with devDependencies or github issue after_load 的例子必须包含像 {'name': 'foo', 'email': 'x@x.org'}.

这样的数据

我想反序列化名称不同于架构属性名称的传入日期(指定 date_key 所需的内容),但尝试时出现错误.我如何使用名称反序列化输入数据,不同于架构属性并在此属性的 data_key 字段中声明?

data_key 是在 marshmallow 3 中引入的。

changelog entry:

Backwards-incompatible: Add data_key parameter to fields for specifying the key in the input and output data dict. This parameter replaces both load_from and dump_to (#717).

和关联 pull-request.

使用marshmallow 2时,必须使用load_from/dump_to:

class FooLoad(Schema):
    name = fields.Str()
    email = fields.Email(load_from='emailAddress', dump_to='emailAddress', required=True)

您正在使用 marshmallow 2,但正在阅读 marshmallow 3 的文档。

请注意,marshmallow 3 包含大量改进并且处于 RC 状态,因此如果您正在开始一个项目,您可以选择 marshmallow 3 并在未来为自己节省一些过渡工作。

我遇到了同样的现象,试图解析 API 响应。事实证明,虽然我需要在响应中更深入地钻取 1 个级别,但比我做的要早。

回复是:

{
  "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)