从documentation开始,我不清楚自定义规则和自定义验证器的用例有何不同。在文档中给出的示例中,唯一的区别是额外的if
语句,用于检查自定义规则中is_odd
的值。我应该何时更喜欢自定义规则,何时更喜欢自定义验证器?
自定义规则
schema = {'amount': {'isodd': True, 'type': 'integer'}}
from cerberus import Validator
class MyValidator(Validator):
def _validate_isodd(self, isodd, field, value):
""" Test the oddity of a value.
The rule's arguments are validated against this schema:
{'type': 'boolean'}
"""
if isodd and not bool(value & 1):
self._error(field, "Must be an odd number")
自定义验证器
from cerberus import Validator
schema = {'amount': {'validator': 'oddity'}}
class AValidator(Validator):
def _validator_oddity(self, field, value):
if value & 1:
self._error(field, "Must be an odd number")
答案 0 :(得分:4)
如果要将某个字段值的验证委托给自定义函数或方法(后者在模式中作为字符串引用),则使用validator
规则,如下所示:
>>> def oddity(field, value, error):
... if not value & 1:
... error(field, "Must be an odd number")
>>> schema = {'amount': {'validator': oddity}}
>>> v = Validator(schema)
>>> v.validate({'amount': 10})
False
>>> v.errors
{'amount': 'Must be an odd number'}
>>> v.validate({'amount': 9})
True
请注意,这些问题的签名是固定的,它们完全取field
(文档中的字段名称),value
和error
(提交错误的方法)作为论据。
Custom rules只能在Validator
子类中定义。与验证可调用被定义为约束的validator
规则相比,自定义规则约束可以在也传递给自定义规则实现的模式中定义(在this answer's example中它名为other
)。因此,可以在模式中控制规则的行为。
validator
规则的文档似乎有误导性,如果不是完全错误的话,我应该尽快修复它!感谢您的报道。