Правило пользовательской нормализации Цербера - PullRequest
0 голосов
/ 27 апреля 2018

Есть ли способ создать собственное правило нормализации в Цербере?

Я использую Cerberus для нормализации сообщений Protobuf перед их сохранением в MongoDB. Один из моих вариантов использования состоит в том, чтобы выровнять под-сообщение к ссылке:

{
    "team": {"id": {"value": "<some-id>"}, "random": "value"}
}

до

{
    "team": {"value": "<some-id>"}
}

Моя схема:

{
    'team': {
        'type': 'primarykey',
        'coerce': 'primarykey',
        'data_relation': {'schema': 0, 'field': 'id'},
        'required': True,
        'permanent': True,
    }
}

Мой coercer для 'primarykey' ожидает второй формат, чтобы он мог преобразовать значение. Если я не нормализую перед этим, невозможно узнать, какой ключ является ссылкой, поскольку все функции, которые принимает coercer, являются значением.

В идеале, я бы запустил пользовательскую функцию нормализации для data_relation до вызова coercer. например _normalize_data_relation.

Edit:

def _normalize_coerce_data_relation(self, value):
        # value is {"id": {"value": "<some-id>"}, "random": "value"}
        # however I do not know the value of the `field` key in
        # the data_relation rule since the only thing passed in
        # is the value itself.

Я не знаю, установлено ли для data_relation в схеме значение field: id или field: random, поэтому я не знаю, как нормализовать.

В идеале мне бы хотелось получить что-то похожее на правило проверки, где я также получаю значение схемы:

def _normalize_data_relation(self, relation, field, value):
    print(relation['field']) # 'id'
    return value[relation['field']]

1 Ответ

0 голосов
/ 29 апреля 2018

Я не уверен, правильно ли я понял ваш вопрос, но это может помочь вам указать, что вы можете определить цепочку коэрсера :

schema = {
    'team': {'coerce': ('data_relation', 'primarykey')}
}

, учитывая, что ваш валидатор реализует метод _normalize_coerce_data_relation.

...