所以我使用Cerberus进行模式验证,但我遇到了一个特殊的问题,即验证了密钥未知的字典的子字典。
所以说我有以下文件:
dict = {
'things': {
'0463': {
'foo': 'blah',
'bar': 'bleep'
},
'0464': {
'foo': 'x',
'bar': 'y'
},
'another_random_id': {
'foo': 'blah',
'bar': 'bleep'
}
}
所以我想验证子域有一个特定的结构(foo
和bar
作为键),但我不知道如何在不事先知道密钥的情况下验证这一点(在我的情况下是随机id的。我认为这是一个很好的使用valueschema但我似乎无法使用'dict'类型的东西使用valueschema。我试图在cerberus中设置以下模式:
schema = {
'things': {
'type': 'dict',
'valueschema': {
'type': 'dict',
'foo': {'type': 'string'},
'bar': {'type': 'string'}
}
}
}
我是否错误地定义了我的架构,或者使用valueschema
的当前实现是不可能的。我在使用valueschema
的存储库中看到了一些测试,但它们只测试valueschema
的类型为int或字符串的位置。
答案 0 :(得分:3)
因此,如果我在valueschema
键之后添加dict
字段,那么我认为cerberus将处理schema
valueschema
类型schema = {
'things': {
'type': 'dict',
'valueschema': {
'type': 'dict',
'schema':{
'foo': {'type': 'string'},
'bar': {'type': 'string'}
}
}
}
}
。所以我的结构应该是:
valueschema
现在还有一些奇怪之处,因为它似乎并不是dict
的设计,期望它会验证类型validate_valueschema
的值。例如,当我从验证器扩展时,我不得不重写required
方法,以便validate
验证的行为与常规模式相同,因为它在调用update
时它未在validate_valueschema
参数中传递的模式。所以我被覆盖的def _validate_valueschema(self, schema, field, value):
if isinstance(value, Mapping):
for key, document in value.items():
validator = self._Validator__get_child_validator()
validator.validate(
{key: document}, {key: schema},
context=self.document, update=self.update)
if len(validator.errors):
self._error(field, validator.errors)
看起来像这样:
update=self.update
我添加了{{1}}。