我正在使用Cerberus来验证具有type
和data
字段的有效负载。根据{{1}}(type
或test
)的值,我想针对不同的约束验证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。
答案 0 :(得分:0)
使用单个架构和验证,您无法完全实现这一点,但您可以使用build
和oneof
规则来获得更清晰的错误报告:
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}]}}