在Cerberus中你可以使用'valueschema'和'dict'类型吗?

时间:2016-06-07 19:01:15

标签: python cerberus

所以我使用Cerberus进行模式验证,但我遇到了一个特殊的问题,即验证了密钥未知的字典的子字典。

所以说我有以下文件:

dict = {
   'things': {
       '0463': {
           'foo': 'blah',
           'bar': 'bleep'
        },
        '0464': {
           'foo': 'x',
           'bar': 'y'
        },
        'another_random_id': {
           'foo': 'blah',
           'bar': 'bleep'
        }
}

所以我想验证子域有一个特定的结构(foobar作为键),但我不知道如何在不事先知道密钥的情况下验证这一点(在我的情况下是随机id的。我认为这是一个很好的使用valueschema但我似乎无法使用'dict'类型的东西使用valueschema。我试图在cerberus中设置以下模式:

schema = {
    'things': {
        'type': 'dict',
        'valueschema': {
             'type': 'dict',
             'foo': {'type': 'string'},
             'bar': {'type': 'string'}
         }
     }
}

我是否错误地定义了我的架构,或者使用valueschema的当前实现是不可能的。我在使用valueschema的存储库中看到了一些测试,但它们只测试valueschema的类型为int或字符串的位置。

1 个答案:

答案 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}}。