cerberus:验证可选字段至少出现一次
cerberus: Validate an optional field occurs at least once
我正在使用 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 之外似乎可行,但如果可能的话,我想将该方法保留在我的验证器中。
如果您希望该方法位于 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
键的结果。 运行 该代码产生
True {}
False {'data': ["Must contain a 'c' key"]}
我正在使用 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 之外似乎可行,但如果可能的话,我想将该方法保留在我的验证器中。
如果您希望该方法位于 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
键的结果。 运行 该代码产生
True {}
False {'data': ["Must contain a 'c' key"]}