顶级棉花糖模式验证

djh*_*djh 4 python marshmallow

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

data, errors = MySchema().load({"some":"data})
Run Code Online (Sandbox Code Playgroud)

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

errors
# => some error message for the field that failed 
Run Code Online (Sandbox Code Playgroud)

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

作为一个任意的例子,说我想验证你试图MySchema().load()n个不同的键.我目前有一个@pre_load方法来检查输入的结构,raise ValidationError('message')如果数据格式不正确,但我想将其作为结果返回.像字段验证那样的错误.我有什么选择?

Max*_*kin 12

您可以使用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
            )
Run Code Online (Sandbox Code Playgroud)

虽然如果您想独立报告不同字段的多个错误,但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
Run Code Online (Sandbox Code Playgroud)

  • 如果您调用“MySchema().validate(data)”而不是“MySchema().load(data)”,这似乎不起作用。有没有办法让它与“validate()”一起工作? (3认同)