2015-11-30 44 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