如何根据使用Cerberus的另一个字段的值来验证模式的字段?

时间:2017-10-07 12:18:27

标签: python validation cerberus

我正在使用Cerberus来验证具有typedata字段的有效负载。根据{{​​1}}(typetest)的值,我想针对不同的约束验证build

到目前为止,我有这个设置:

data

但是当预期的子模式失败时,也会报告关于另一个的错误:

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

此问题源自this issue

1 个答案:

答案 0 :(得分:0)

使用单个架构和验证,您无法完全实现这一点,但您可以使用buildoneof规则来获得更清晰的错误报告:

dependencies

这是其中一个子模式的不允许值的结果:

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}]}}