Есть ли способ создать собственное правило нормализации в Цербере?
Я использую 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']]