Правило пользовательской нормализации Цербера
Есть ли способ создать собственное правило нормализации в Цербере?
Я использую 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
до того, как вызывается. например _normalize_data_relation
,
Редактировать:
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 ответ
Я не уверен, правильно ли я понял ваш вопрос, но это может помочь вам указать, что вы можете определить цепочку принуждения:
schema = {
'team': {'coerce': ('data_relation', 'primarykey')}
}
учитывая, что ваш валидатор реализует _normalize_coerce_data_relation
метод.