В Цербере вы можете использовать 'valueschema' с типом 'dict'?

Поэтому я использую Cerberus для проверки схемы, но я сталкиваюсь с определением с проверкой подсписка словаря, ключ которого неизвестен.

Скажем, у меня есть следующий документ:

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

Итак, я хочу подтвердить, что subdictionaries имеют определенную структуру (foo а также bar в качестве ключей), но я не могу придумать способ проверить это, не зная заранее ключей (которые в моем случае являются случайными идентификаторами. Я подумал, что это хорошее использование valueschema, но я не могу получить valueschema работать с чем-то типа "dict". Я попытался установить следующую схему в Цербере:

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

Неправильно ли я определяю свою схему или это невозможно в текущей реализации valueschema, Я видел некоторые тесты в хранилище, которое использовало valueschema, но они только тестировали, где тип valueschema был int или строка.

1 ответ

Решение

Вот я и понял, что Цербер справится valueschema если это типа dict если я поставлю 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 это все, что я добавил.

Другие вопросы по тегам