使用 cerberus 1.0,您可以按照本文档示例oneof
中的粘合形式实现此使用规则。有了这个,您可以针对必须验证的不同模式进行验证:
缺点是您可能需要在 dict 上增加一个级别,如下price
所示:
第一种方案,运费和价格:
>>> schema_1 = {'freight_id': {'type': 'integer', 'required': True},
... 'price': {'type': 'integer', 'required': True}}
第二种模式,投标和价格:
>>> schema_2 = {'tender_id': {'type': 'integer', 'required': True},
... 'price': {'type': 'integer', 'required': True}}
第三种方案,运费、标书和价格:
>>> schema_3 = {'tender_id': {'type': 'integer', 'required': True},
... 'freight_id': {'type': 'integer', 'required': True},
... 'price': {'type': 'integer', 'required': True}}
把这些放在一起:
>>> from cerberus import Validator
>>>
>>> price_validator = Validator(
... {'price': {'type': 'dict',
... 'oneof_schema': [schema_1, schema_2, schema_3]}})
结果:
>>> price_validator.validate({"price": {"freight_id": 1, "price" : 12000}})
True
>>> price_validator.validate({"price": {"tender_id": 2, "price" : 12000}})
True
>>> price_validator.validate(
... {"price": {"freight_id": 1, "tender_id": 2, "price": 1200}})
True
>>> price_validator.validate({"price": {"freight_id": 1, "tender_id": 2}})
False
>>> price_validator.validate({"price": {"price" : 12000}})
False