python - 在 Eve 中修补到具有 'valueschema' 且类型为 'dict' 的字段时,无法序列化数据

标签 python eve cerberus

假设我有以下文档:

test_obj = {
    'my_things':{
        'id17': {
            'blah': 3,
            'weird': 'yay',
            'thechallenge': ObjectId('5712d06fdb4d0856551300d2')
        },
        'id32': {
            'blah': 62,
            'weird': 'hoorah',
            'thechallenge': ObjectId('5712d06fdb4d0856551300d4')
        }
    },
    '_id': 12,
    'an_extra_field': 'asdf'
}

对于本文档,我有以下架构:

API.config['DOMAIN']['test_obj']['schema'] = {
    'id': {'type': 'int'},
    'an_extra_field': {'type': 'string'},
    'my_things': {
        'type': 'dict',
        'valueschema': {
            'type': 'dict',
            'schema': {
                'blah': {'type': 'dict'},
                'weird': {'type': 'string'},
                'thechallenge': {'type': 'objectid'}
            }
        }
    }
}

现在假设我使用以下伪代码制作补丁:

data = {
    'mythings': {
        'id17': {
            'thechallenge': '5712d06fdb4d0856551300d8'
        }
    }
}
PATCH(url='/v1/test_objs/12', data=data)

当我制作此补丁时,Cerberus 在验证期间引发错误,提示“值‘5712d06fdb4d0856551300d8’无法转换为 ObjectId”。现在这是一个有效的对象 ID,我发现如果我对其他非 valueschema 字段进行修补,它不会引发此错误。看起来 valueschema 并不意味着具有 dict 的值,并且添加额外的“schema”属性是我可以绕过 cerberus 引发 schemaerror/让 cerberus 实际上验证我的字段的唯一方法。但夏娃实际上似乎并没有正确序列化我字典中的字段。当它传递给 Cerberus 时,它应该是 ObjectId 类型。

我暂时解决这个问题的方法是在 Eve 中操作我的代码。在 common.py(模块)中,我在第 398 行添加了序列化(函数),其中检查字段模式是否为“valueschema”:

elif field_type == 'dict' and 'schema' in field_schema['valueschema']:
    for subdocument in document[field].values():
        serialize(subdocument, schema=field_schema['valueschema']['schema'])

我不应该使用 dict 类型作为 valueschema 吗?如果不是,我还应该如何处理这种情况?我不想维护我自己的 Eve 分支,所以如果其他人确实希望能够使 valueschemadict 类型,我是否应该提交一个拉取请求这个改变?

最佳答案

刚刚发布的 Eve v0.6.4 已修复此问题。

关于python - 在 Eve 中修补到具有 'valueschema' 且类型为 'dict' 的字段时,无法序列化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37690142/

相关文章:

python - Cerberus 的严格模式验证

python - Google Compute Engine - 在启动脚本结束时重新启动

Python - 从Sql Server语句中的字段获取值

eve - 如何实现嵌入对象的可附加列表

Python Cerberus 如何检查动态根 key

python - Cerberus 依赖项如何引用文档中较高的字段?

python - 从 Python 中的类方法返回多个值的最有效方法是什么?

python - 使用 feedparser 检查 RSS 提要是否有新内容

python - Python Eve 中的时间字段

python - 在生产环境中运行 Python Eve Rest API