2

考虑以下 Cerberus 模式:

{
  'employee': {
    'type': 'list',
    'schema': {
      'type': 'dict',
      'schema': {
        'id': {'required': True, 'type': 'integer'},
        'name': {'required': True, 'type': 'string'}
      }
    }
  },
  'ceo-employee-id': {'required': True, 'type': 'integer'}
}

1) 如何验证 ceo-employee-id 是否与员工列表中的 id 值之一匹配?(参照完整性)

2) 如何验证员工列表中的每个 ID 都是唯一的(即没有重复的员工 ID)?

我意识到我可以在验证和解析下面@rafael 建议的配置后在运行时执行此操作。我想知道我是否可以使用 Cerberus 验证功能来做到这一点。

4

2 回答 2

3

您需要使用实现方法的自定义验证器,使用这些方法中的属性,并修改您的架构以包含这些:check_withdocument

from cerberus import Validator


class CustomValidator(Validator):
    def _check_with_ceo_employee(self, field, value):
        if value not in (x["id"] for x in self.document["employee"]):
            self._error(field, "ID is missing in employee list.")

    def _check_with_employee_id_uniqueness(self, field, value):
        all_ids = [x["id"] for x in self.document["employee"]]
        if len(all_ids) != len(set(all_ids)):
            self._error(field, "Employee IDs are not unique.")


validator = CustomValidator({
    'employee': {
        'type': 'list',
        'schema': {
            'type': 'dict',
            'schema': {
                'id': {'required': True, 'type': 'integer'},
                'name': {'required': True, 'type': 'string'}
             },
        },
        'check_with': 'employee_id_uniqueness'
    },
    'ceo-employee-id': {'required': True, 'type': 'integer', 'check_with': 'ceo_employee'}
})

参考文档包含此处使用的所有部分的提示。

(对于示例中可能出现的任何缩进错误,我深表歉意。)

于 2019-05-04T18:18:53.310 回答
0

假设您已经验证了 json 的架构,您可以像这样轻松检查您的两个条件。让 doc 成为您的 json 文档。

employee_ids = [employee['id'] for employee in doc['employee']]
ceo_employee_id =  doc['ceo-employee-id']

1) 如何验证 ceo-employee-id 是否与员工列表中的 id 值之一匹配?(参照完整性)

ceo_id_exists_in_employees = any([employee_id == ceo_employee_id for employee_id in employee_ids])

2) 如何验证员工列表中的每个 ID 都是唯一的(即没有重复的员工 ID)?

employee_id_is_unique = len(set(employee_ids)) == len(employee_ids)

3) 断言这两个值都是 True

if ceo_id_exists_in_employees and employee_id_is_unique:
    print('passed')
else:
    print('failed')
于 2019-04-21T14:13:09.053 回答