Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Cerberus: multipe schemas for a single filed?

I am trying to use Cerberus to validate some data but I run into a problem.

I defined several smaller schema such as:

A = {"type": "dict", "required": False, "schema": {"name": {"type": "string"}}}

B = {"type": "dict", "required": False, "schema": {"age": {"type": "integer"}}}

C = {"type": "dict", "required": False, "schema": {"gender": {"type": "string"}}}

And the higher level schema is like:

{"something": {"type": "list", "schema": "type": [A, B, C]}}

This obviously doesn't work.

I want to validate a list, the elements in which only need to be validated by one of (A, B, C). I don't know how to do that with Cerberus and am looking for some help.

Thanks.

like image 760
Fan Zhang Avatar asked Oct 30 '25 07:10

Fan Zhang


1 Answers

Try this:

A = {"type": "dict", "schema": {"name": {"type": "string"}}}
B = {"type": "dict", "schema": {"age": {"type": "integer"}}}
C = {"type": "dict", "schema": {"gender": {"type": "string"}}}

schema = {'field':{'type':'list','anyof_schema':[A,B,C]}}

v = Validator(schema)

challenge = {'field':[{'name':'a name'}]}

v.validate(challenge)
True

This works thanks to the anyof_*, which is one of the several options offered by the so-called of-rules. These rules allow you to define different sets of rules to validate against. The field will be considered valid if it validates against the set in the list according to the prefixes logics all, any, one or none. For details, see the relevant documentation.

like image 60
Nicola Iarocci Avatar answered Nov 01 '25 21:11

Nicola Iarocci