Я использую Cerberus для проверки полезной нагрузки с полем type
и data
. В зависимости от значения 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
имеет значение build
?
Этот вопрос основан на этой проблеме.