如何使用Cerberus验证列表元素满足多个Schema中的任意一个?
解决Cerberus列表元素匹配任意Schema的问题
我懂你遇到的困扰了——Cerberus里直接把多个Schema塞进type字段是行不通的,不过咱们可以用Cerberus内置的**anyof规则**来实现“列表元素符合A、B、C中任意一个Schema即可通过验证”的需求,这正是专门处理这类“满足任一条件”场景的工具。
问题根源
你之前写的{"type": [A, B, C]}写法错误,因为type字段仅接受表示数据类型的字符串(比如"string"、"dict")或基础类型的列表,不能直接传入完整的Schema字典。
正确实现方案
我们只需要把列表元素的验证规则改成用anyof包裹你的三个基础Schema即可,具体代码如下:
from cerberus import Validator # 定义你的基础Schema,和之前一致 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"}}} # 修正后的上层Schema upper_schema = { "something": { "type": "list", "schema": { "anyof": [A, B, C] } } } # 验证测试 validator = Validator(upper_schema) # 测试用例1:所有元素分别匹配A、B、C,验证通过 valid_data = { "something": [ {"name": "Zhang San"}, {"age": 28}, {"gender": "male"} ] } print(validator.validate(valid_data)) # 输出: True # 测试用例2:包含不符合任何Schema的元素,验证失败 invalid_data = { "something": [ {"name": "Li Si"}, {"weight": 75} # 这个字典不匹配A/B/C的任何一个Schema ] } print(validator.validate(invalid_data)) # 输出: False print(validator.errors) # 会输出具体的错误信息,提示元素不符合anyof的要求
额外说明
- 如果你的需求是列表元素必须恰好匹配A、B、C中的一个(不能同时匹配多个),可以把
anyof换成oneof规则,Cerberus会严格检查元素只匹配其中一个Schema。 anyof规则不仅支持Schema字典,也支持其他验证规则的组合,灵活性很高。
内容的提问来源于stack exchange,提问作者Fan Zhang
相关产品推荐
相关产品推荐

