cerberus:禁止现场存在

时间:2019-04-15 02:25:27

标签: python validation cerberus

我想使用Cerberus验证对象中是否存在字段。

我想使用类似的东西:

my_schema = {
    'normal_field': {
        'type': 'string',
    },
    'forbidden_field': {
        'forbid': True,
    },
}

基本上,我永远不会接受forbidden_field随附的对象。现在,我接受更改验证器的方法:

validator.allow_unknown = False

在设置仅包含“允许的”字段的模式时,基本上可以做到这一点,但是我真的不喜欢它的功能,因为它禁止我接受其他字段,而不仅限于forbidden_field

我还看到了allowedforbidden验证规则,但是它们检查字段的值,而不是字段的真正存在。

那么,我怎么能告诉我的验证器只禁止Cerberus存在特定字段?

2 个答案:

答案 0 :(得分:2)

我似乎回想起以前遇到过这种特殊的用例。您可以尝试以下操作:

from cerberus import Validator

schema = {
    'foo': {
        'type': 'string',
        'validator': lambda field, value, error: error(field, 'field is forbidden!!'),
    }
}
v = Validator(schema)
v.allow_unknown = True
doc = {
    'foo': 'bar'
}
print(v.validate(doc))

结果应返回False,而v.errors应该说“字段被禁止!”

请参阅:

答案 1 :(得分:1)

我使用readonly规则解决了这个问题,该规则还允许我设置default_setter的值。

@kchan的答案适用于不允许使用该字段,但会破坏规范化集成(例如,尝试与default_setter一起使用)。