Cerberus依赖如何引用文档中较高的字段?

时间:2016-11-22 18:27:07

标签: python validation cerberus

我正在尝试为具有引用文档中较高位置的依赖项的文档创建架构。例如:

document = {
    'packages': {
        'some-package': {'version': 1}
    },
    'build-steps': {
        'needs-some-package': {'foo': 'bar'},
        'other-thing': {'funky': 'stuff'}
    }
}

我在这里遇到的是强制build-steps.needs-some-package和packages.some-package之间的依赖关系。每当构建步骤包含" needs-some-package"时,包必须包含" some-package"。

当"需要 - 某些包装"不存在," some-package"不需要。所以这份文件也应该验证。

other_document = {
    'packages': {
        'other-package': {'version': 1}
    },
    'build-steps': {
        'other-thing': {'funky': 'stuff'}
    }
}

具有依赖性的模式似乎是适当的位置

schema = {
    'packages': {
        'type': 'dict',
        'valueschema': {
            'type': 'dict'
        }
    },
    'build-steps': {
        'type': 'dict',
        'schema': {
            'needs-some-package': {
                'type': 'dict',
                'dependencies': 'packages.some-package'
            },
            'other-thing': {
                'type': 'dict'
            }
        }
    }
}

但这并不奏效,因为看来Cerberus正在寻找"包装"在"构建步骤"下的子文档中。有没有办法上升文档树?或者引用与文档根目录相关的内容?

1 个答案:

答案 0 :(得分:3)

在1.0.2版中解决了已解决的问题:

  

处理子文档时,查找相关字段   从该文档的级别开始。为了解决这个问题   处理文档作为根级别,声明必须以a开头   ^。两个初始插入符号(^^)的出现被解释为a   文字,单一^没有特殊意义。

示例代码:

import cerberus

schema = {
    'packages': {
        'type': 'dict',
        'valueschema': {
            'type': 'dict'
        }
    },
    'build-steps': {
        'type': 'dict',
        'schema': {
            'needs-some-package': {
                'type': 'dict',
                'dependencies': '^packages.some-package'
            },
            'other-thing': {
                'type': 'dict'
            }
        }
    }
}

document = {
    'packages': {
        'some-package': {'version': 1}
    },
    'build-steps': {
        'needs-some-package': {'foo': 'bar'},
        'other-thing': {'funky': 'stuff'}
    }
}

validator = cerberus.Validator(schema)
print(validator.validate(document))