0

有没有办法在 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,
    }
}

我的 'primarykey' 强制器需要第二种格式,以便它可以转换值。如果我事先不规范化,就不可能知道哪个键是引用,因为所有强制函数获取的都是值。

理想情况下,我会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: idor field: random,因此我不知道如何规范化。

理想情况下,我想要的是类似于验证规则的东西,我也可以在其中获得模式的值:

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

1 回答 1

0

我不确定我是否正确地回答了你的问题,但它可能会帮助你指出,你可以定义一个强制链

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

假设您的验证器实现了一个_normalize_coerce_data_relation方法。

于 2018-04-29T12:37:11.913 回答