2015-11-30 36 views
1

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')如果数据不合格,但我想返回结果。像字段验证这样的错误。我有什么选择?

+1

'棉花糖似乎是一个有趣的图书馆。我很惊讶没有标签,所以我创建了一个标签。 –

+2

查看文档的架构级验证部分:https://marshmallow.readthedocs.org/en/latest/extending.html#schema-level-validation。它将向您展示如何使用'@ validates_schema'装饰器来注册模式验证器以及如何在特定字段上存储错误。 –

回答

5

您可以使用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 
      ) 

但如果你想为不同领域的独立报告多个错误,棉花糖在这一刻不支持报告为不同领域的多个不同的错误,你需要把单独的验证分为不同的方法:

class MySchema(Schema): 
    # ... 

    @validates_schema 
    def validate_foo(self, data): 
     pass 

    @validates_schema(skip_on_field_errors=True): 
    def validate_bar(self, data): 
     pass