在 Cerberus 中,您可以将 'valueschema' 与类型 'dict' 一起使用吗?
In Cerberus can you use 'valueschema' with a type of 'dict'?
所以我正在使用 Cerberus 进行模式验证,但我 运行 进入了一个特定的验证字典的子字典,其键是未知的。
假设我有以下文件:
dict = {
'things': {
'0463': {
'foo': 'blah',
'bar': 'bleep'
},
'0464': {
'foo': 'x',
'bar': 'y'
},
'another_random_id': {
'foo': 'blah',
'bar': 'bleep'
}
}
所以我想验证子词典是否具有特定的结构(foo
和 bar
作为键),但我无法在不知道前面的键的情况下找到验证它的方法时间(在我的例子中是随机 id。我认为这是对 valueschema 的一个很好的使用,但我似乎无法让 valueschema 与 'dict' 类型的东西一起工作。我试图在 cerberus 中设置以下模式:
schema = {
'things': {
'type': 'dict',
'valueschema': {
'type': 'dict',
'foo': {'type': 'string'},
'bar': {'type': 'string'}
}
}
}
我是否错误地定义了我的架构,或者这对于 valueschema
的当前实现是不可能的。我在存储库中看到一些使用 valueschema
的测试,但它们只测试 valueschema
的类型是 int 还是字符串。
所以我发现,如果我在 valueschema
键后放置一个 schema
字段,cerberus 将处理 valueschema
如果它是 dict
类型。所以我的结构应该是:
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
是我加的。
所以我正在使用 Cerberus 进行模式验证,但我 运行 进入了一个特定的验证字典的子字典,其键是未知的。
假设我有以下文件:
dict = {
'things': {
'0463': {
'foo': 'blah',
'bar': 'bleep'
},
'0464': {
'foo': 'x',
'bar': 'y'
},
'another_random_id': {
'foo': 'blah',
'bar': 'bleep'
}
}
所以我想验证子词典是否具有特定的结构(foo
和 bar
作为键),但我无法在不知道前面的键的情况下找到验证它的方法时间(在我的例子中是随机 id。我认为这是对 valueschema 的一个很好的使用,但我似乎无法让 valueschema 与 'dict' 类型的东西一起工作。我试图在 cerberus 中设置以下模式:
schema = {
'things': {
'type': 'dict',
'valueschema': {
'type': 'dict',
'foo': {'type': 'string'},
'bar': {'type': 'string'}
}
}
}
我是否错误地定义了我的架构,或者这对于 valueschema
的当前实现是不可能的。我在存储库中看到一些使用 valueschema
的测试,但它们只测试 valueschema
的类型是 int 还是字符串。
所以我发现,如果我在 valueschema
键后放置一个 schema
字段,cerberus 将处理 valueschema
如果它是 dict
类型。所以我的结构应该是:
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
是我加的。