Cerberus自定义规范化规则

时间:2018-04-27 13:08:42

标签: python validation cerberus

有没有办法在Cerberus中创建自定义规范化规则?

我使用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,
    }
}

我的主要关键词&#39;期望第二种格式,以便它可以转换价值。如果我事先没有规范化,就不可能知道哪个键是引用,因为所有的coercer函数都是值。

理想情况下,我会在调用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 个答案:

答案 0 :(得分:0)

我不确定我的问题是否正确,但可能有助于您指出,您可以定义coercer chain

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

鉴于您的验证器实现了_normalize_coerce_data_relation方法。