6

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

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”。

当“needs-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 正在“构建步骤”下的子文档中寻找“包”。有没有办法上文档树?或者参考文档根目录的内容?

4

1 回答 1

3

描述的问题在 1.0.2 版中得到解决:

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

示例代码:

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))
于 2017-03-21T12:47:33.920 回答