2017-10-07 80 views
0

我正在使用Cerberus来验证有效载荷有typedata字段。根据typetestbuild)的值,我想验证data针对不同的约束。如何根据Cerberus中另一个字段的值验证字段对照模式?

到目前为止,我甲肝这种设置:

test_task = {"folder": {"required": True}} 
build_task = {"environment": {"allowed": ["staging", "product"]}} 
abstract_task = {'type': {'allowed': ['test', 'build']}, 
       'data': {'type': 'dict', 
          'required': True, 
          'anyof': [{'schema': test_task}, 
            {'schema': build_task}]}} 

但是,当预期的子模式失败,也对于其他错误,就会报:

>>> validator = cerberus.Validator(schemas.abstract_task) 
>>> validator.validate({ 
...  "type": "build", 
...  "data": {"environment": "staging"}}) 
>>> pp validator.errors 
{'data': {'anyof': 'no definitions validated', 
      'definition 0': {'environment': 'unknown field', 
          'folder': 'required field'}, 
      'definition 1': {'environment': 'unallowed value bad'}}} 

有没有办法有条件使用definition 1当兄弟姐妹type的值为build

此问题来自this issue

回答

0

通过单一架构和验证你不能准确地做到这一点,但你可以利用oneofdependencies规则,以得到更清晰的错误报告:

test_task = {"folder": {"required": True}} 
build_task = {"environment": {"allowed": ["staging", "product"]}} 
abstract_task = {'type': {'allowed': ['test', 'build']}, 
       'data': {'type': 'dict', 
          'required': True, 
          'oneof': [{'dependencies': {'type': 'test'}, 
            'schema': test_task}, 
            {'dependencies': {'type': 'build'}, 
            'schema': build_task}]}} 

这是它是如何变成了与其中一个子模的未被允许的值:

>>> document = {"type": "build", "data": {"environment": "legacy"}} 
>>> validator(document, abstract_task) 
{'data': [{'oneof': ['none or more than one rule validate', 
        {'oneof definition 0': ["depends on these values: {'type': 'test'}", 
              {'environment': ['unknown field'], 
               'folder': ['required field']}], 
         'oneof definition 1': [{'environment': ['unallowed value legacy']}]} 
        ]}]} 
相关问题