cerberus:验证至少在上出现可选字段

2024-05-13 03:19:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我用cerberus来验证数据。我的一个字段是可选的-它不需要为每个项目都显示。但是,键必须在整个数据数组中至少填充一次。在

例如,假设我要验证密钥'c'出现在数据列表中的至少一个字典中:

from cerberus import Validator

has_c = {'data': [{'a': 1, 'b': 2}, {'b': 2}, {'c': 3}]}
no_c = {'data': [{'a': 1, 'b': 2}, {'a': 1}]}

schema = {'data':
          {'type': 'list',
           'schema': {
               'type': 'dict',
               'schema': {
                   'a': {'required': True},
                   'b': {'required': True},
                   'c': {'required': False, 'at_least_one': True}
               }
           }
           }
          }

class MyValidator(Validator) # Some fancy code...
....

v = MyValidator()

v.validate(has_c, schema) # Passes
v.validate(no_c, schema) # Fails

这在cerberus之外似乎是可行的,但是如果可能的话,我希望将该方法保存在我的验证器中。在


Tags: 数据项目notruedataschematyperequired
1条回答
网友
1楼 · 发布于 2024-05-13 03:19:59

如果您希望方法在Validator子类中,那么您需要像您所想的那样创建一个自定义规则。在

from cerberus import Validator

test_with_c = {'data': [{'a': 1, 'b': 2}, {'b': 2}, {'c': 3}]}
test_with_no_c = {'data': [{'a': 1, 'b': 2}, {'a': 1}]}

class MyValidator(Validator):
    def _validate_has_c(self, has_c, field, value):
        seen_c = False
        for v in value:
            if "c" in v:
                seen_c = True
        if has_c and not seen_c:
            self._error(field, "Must contain a 'c' key")

schema = {
    "data": {
        "type": "list",
        "has_c": True
    }
}

v = MyValidator(schema)

print(v(test_with_c), v.errors)
print(v(test_with_no_c), v.errors)

运行此操作将产生您想要的结果,即在其中一个元素中查找c键。生成正在运行的代码

^{pr2}$

相关问题 更多 >