我应该如何在 Marshmallow Python 中添加一个包含字典列表的字段?

How should I add a field containing a list of dictionaries in Marshmallow Python?

Marshmallow 中,为了拥有列表字段,您可以使用:

include_in = fields.List(cls_or_instance=fields.Str(),
                         default=['sample1', 'sample2'])

这没问题,但我有一个新要求,即在字段中有一个字典列表。示例负载:

[{
  "name": "Ali",
  "age": 20
},
{
  "name": "Hasan",
  "age": 32
}]

此负载是更大架构的一部分,所以现在的问题是我应该如何添加和验证这样的字段?


编辑-1: 我更进一步,发现 Marshmallow 中有一个 Dict 字段类型,所以到目前为止我有以下代码示例:

fields.List(fields.Dict(
        keys=fields.String(validate=OneOf(('name', 'age'))),
        values=fields.String(required=True)
))

现在出现新的问题,我不能为字典中的字段设置不同的数据类型(nameage)。如果有人能对此有所了解,我会很高兴。

如果列表中的项目具有相同的形状,您可以在 fields.List 中使用嵌套字段,如下所示:

class PersonSchema(Schema):
    name = fields.Str()
    age = fields.Int()

class RootSchema(Schema):
    people = fields.List(fields.Nested(PersonSchema))

使用一个模式验证字段中字典列表的另一种方法 class。

from marshmallow import Schema, ValidationError


class PeopleSchema(Schema):
    name = fields.Str(required=True)
    age = fields.Int(required=True)


people = [{
    "name": "Ali",
    "age": 20
},
{
    "name": "Hasan",
    "age": 32
},
{
    "name": "Ali",
    "age": "twenty"  # Error: Not an int
}
]


def validate_people():
    try:
        validated_data = PeopleSchema(many=True).load(people)
    except ValidationError as err:
        print(err.messages)

validate_people()

输出:

{2: {'age': ['Not a valid integer.']}}