我应该如何在 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)
))
现在出现新的问题,我不能为字典中的字段设置不同的数据类型(name
和age
)。如果有人能对此有所了解,我会很高兴。
如果列表中的项目具有相同的形状,您可以在 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.']}}
在 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)
))
现在出现新的问题,我不能为字典中的字段设置不同的数据类型(name
和age
)。如果有人能对此有所了解,我会很高兴。
如果列表中的项目具有相同的形状,您可以在 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.']}}