Как я могу проверить поле по схеме в зависимости от значения другого поля с Цербером?
Я использую Цербер для проверки полезных нагрузок, которые имеют 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
?
Этот вопрос является производным от этой проблемы.
1 ответ
С единой схемой и проверкой вы не можете точно достичь этого, но вы можете использовать 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}]}}
Вот как это получается с недопустимым значением для одной из подсхем:
>>> 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']}]}
]}]}