在python棉花糖中序列化映射数组的行为而不必单独迭代和捕获ValidationErrors

问题描述

是否可以将字典列表反序列化为给定的架构?在文档中,您可以在模式对象中传递many参数:

from marshmallow import Schema,fields


class UserSchema(Schema):
    name = fields.str()
    email = fields.Email()
    created_at = fields.DateTime()


user1 = dict(name="Mick",email="mick@stones.com")
user2 = dict(name="Keith",email="keith@stones.com")
users = [user1,user2]
result = UserSchema().load(users,many=True)
print(result)
# [{'name': u'Mick',#   'email': u'mick@stones.com',#   'created_at': '2014-08-17T14:58:57.600623+00:00'}
#  {'name': u'Keith',#   'email': u'keith@stones.com',#   'created_at': '2014-08-17T14:58:57.600623+00:00'}]

当单个对象对该架构无效时,它将停止整个过程,并且不会将任何数据保存到指定的变量中,而不得不借助for循环并尝试捕获异常,如下所示:>

from marshmallow import Schema,fields,ValidationError


class UserSchema(Schema):
    name = fields.Str(required=True)
    email = fields.Email()
    created_at = fields.DateTime()


user1 = dict(name=None,user2]
result = []
errors = []

for user in users:
    try:
        result.append(UserSchema().load(user))
    except ValidationError as error:
        errors.append(dict(data=error.data,messages=error.messages))

print(result)
print(errors)
# [{'email': 'keith@stones.com','name': 'Keith'}]
# [{'data': {'name': None,'email': 'mick@stones.com'},'messages': {'name': ['Field may not be null.']}}]

所以我的问题是:有没有办法不必诉诸这种策略?类似于以下格式:

result,errors: UserSchema().load(users,many=True)

我尝试了上述方法,目前会引发错误(因为您无法将一个值分解为两个值)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)