7

Marshmallow#validation,我知道我可以在模式中的特定字段上注册验证器。如果验证器失败,则会出现以下错误:

data, errors = MySchema().load({"some":"data})

将包含验证器失败的任何字段的错误信息:

errors
# => some error message for the field that failed 

我的问题:是否可以在架构级别(而不是在单个字段级别)进行验证并且仍然以上述方式返回错误?

作为一个任意示例,假设我想验证您是否尝试了MySchema().load()n 个不同的键。我目前有一个@pre_load方法可以检查输入的结构以及raise ValidationError('message')数据是否格式错误,但我想像字段验证一样将其作为 result.errors 返回。我有哪些选择?

4

1 回答 1

18

您可以使用validates_schema装饰器对整个对象运行验证:

class MySchema(marshmallow.Schema):
    # ...

    @marshmallow.validates_schema(skip_on_field_errors=True)
    def validate_object(self, data):
        if data['foo'] < data['bar']:
            raise marshmallow.ValidationError(
                'Value should not be less than bar',
                ['foo']  # name of field to report error for
            )

虽然如果要独立报告不同字段的多个错误,Marshmallow 目前不支持报告不同字段的多个不同错误,需要将单独的验证放入单独的方法中:

class MySchema(Schema):
    # ...

    @validates_schema
    def validate_foo(self, data):
        pass

    @validates_schema(skip_on_field_errors=True)
    def validate_bar(self, data):
        pass
于 2016-12-01T01:06:31.340 回答