修补到具有' valueschema'的字段时无法序列化数据。属于' dict'在夏娃

时间:2016-06-07 22:00:40

标签: 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在验证期间引发错误,说"value '5712d06fdb4d0856551300d8' cannot be converted to a ObjectId"。现在这是一个有效的对象id,我发现如果我对其他非valueschema字段进行补丁,则不会引发此错误。似乎valueschema并不意味着具有dict的价值,并且添加了一个额外的'架构'属性是唯一可以绕过cerberus提出模式错误/让cerberus实际验证我的字段的方法。但是,前夕似乎并没有正确地在我的字典中序列化我的字段。它传递给Cerberus时应该是ObjectId类型。

我暂时解决这个问题的方法是在Eve中操纵我的代码。在398行中的serialize(function)中的common.py(module)中添加了一个,它检查字段模式是否为' 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类型?如果不是我应该如何处理这种情况?我想不必维持我自己的夏娃分支,所以如果其他人确实想要valueschema类型为dict,我应该提交一个拉动请求吗?

1 个答案:

答案 0 :(得分:1)

已经使用刚刚发布的Eve v0.6.4修复了这个问题。