0

希望社区中的人可以提供帮助。

我们有一个正在尝试解决的验证案例。通过 Cerberus 提供的现有规则或创建新规则。

情况1

如果“initiatedBy”的特定验证通过,我们只想对“searchResultSetId”执行验证。以下是文件,我认为这是代表我们正在尝试做的最简单的方法。

在下面的架构中,您会注意到“searchResultSetId”有一个名为“dependson”的 dict 类型规则。dict 的键是兄弟姐妹'initiateBy',其值与其他验证类似。如果'dependson'中的验证通过,则应执行'searchResultSetId'中的其余验证。如果'dependson'中的验证失败,则应跳过'searchResultSetId'中的剩余验证。

doc = {
    'msg': {
        'initiatedBy': 'bookmark', 
        'searchResultSetId': '1hd76t'
    }
}
schema = {
    'initiatedBy': {
        'type': 'string',
        'nullable': True,
        'empty': False,
    },
    'searchResultSetId': {
        'dependson': {
            'initiatedBy': {
                'allowed': [
                    'result-list',
                    'research-starter',
                    'content-vertical',
                    'browser-history'
                ],
            }
        },
        'nullable': True,
        'type': 'string',
        'empty': False,
    }
}

在上面的示例中,将跳过下面的验证,因为“书签”不在允许的值列表中。

{
    'searchResultSetId': {
        'nullable': True,
        'type': 'string',
        'empty': False,
    }
}

到目前为止,使用自定义验证器方法,我们不确定如何跳过属性的剩余验证。有没有办法做到这一点?以下是我们目前所拥有的:

class CustomValidator(Validator):
    def _validate_dependson(self, dependson, field, value):
        """{'type': 'dict'}"""
        passed = Validator(normalize=False, allow_unknown=True, require_all=False, schema=dependson).validate(document=self.document)
        if not passed:
            # skip remaining validations for field?
            pass

感谢您的时间和帮助。

4

0 回答 0