<p>使用Cerberus1.0,您可以使用<code>oneof</code>规则以其粘合形式实现,如本文档<a href="http://docs.python-cerberus.org/en/stable/validation-rules.html#of-rules-typesaver" rel="nofollow noreferrer">example</a>。这样,您就可以针对不同的模式进行验证,其中只有一个模式必须验证:</p>
<p>缺点是,您可能需要对您的dict增加一个级别,如下面的<code>price</code>:</p>
<p>第一种方案,运费和价格:</p>
<pre><code>>>> schema_1 = {'freight_id': {'type': 'integer', 'required': True},
... 'price': {'type': 'integer', 'required': True}}
</code></pre>
<p>投标书和价格表:</p>
^{pr2}$
<p>第三种方案,运费、投标和价格:</p>
<pre><code>>>> schema_3 = {'tender_id': {'type': 'integer', 'required': True},
... 'freight_id': {'type': 'integer', 'required': True},
... 'price': {'type': 'integer', 'required': True}}
</code></pre>
<p>把这些放在一起:</p>
<pre><code>>>> from cerberus import Validator
>>>
>>> price_validator = Validator(
... {'price': {'type': 'dict',
... 'oneof_schema': [schema_1, schema_2, schema_3]}})
</code></pre>
<p>结果:</p>
<pre><code>>>> 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
</code></pre>