Цербер: запретить существование поля - PullRequest
4 голосов
/ 15 апреля 2019

Я хочу использовать Цербер для проверки того, что поле НЕ присутствует в объекте.

Я хотел бы использовать что-то вроде:

my_schema = {
    'normal_field': {
        'type': 'string',
    },
    'forbidden_field': {
        'forbid': True,
    },
}

По сути, я бы никогда не принял объект, который идет с forbidden_field. Прямо сейчас я принимаю изменение моего валидатора с:

validator.allow_unknown = False

Что в основном помогает при настройке схемы только с «разрешенными» полями, но мне не очень нравится то, что она делает, так как это запрещает мне принимать другие поля, не только forbidden_field.

Я также видел правила проверки allowed и forbidden, но они проверяют значение поля, а не его существование.

Итак, как я мог сказать моему валидатору запретить существование только определенного поля с Цербером?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2019

Кажется, я вспомнил, что сталкивался с этим конкретным случаем ранее. Вы можете попробовать следующее:

from cerberus import Validator

schema = {
    'foo': {
        'type': 'string',
        'validator': lambda field, value, error: error(field, 'field is forbidden!!'),
    }
}
v = Validator(schema)
v.allow_unknown = True
doc = {
    'foo': 'bar'
}
print(v.validate(doc))

Результат должен вернуть False, а v.errors должен сказать "поле запрещено !!"

см

1 голос
/ 16 апреля 2019

Я исправил эту проблему с помощью правила readonly, которое также позволило мне установить значение default_setter.

@ kchan работает так, что поле не разрешено, но оно нарушаетсяинтеграция нормализации (например, попытка использовать его с default_setter).

...