В Цербере вы можете использовать '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
это все, что я добавил.