在 Eve 中修补到具有 'dict' 类型 'valueschema' 的字段时无法序列化数据
Cannot serialize data when patching to a field that has a 'valueschema' that is of type 'dict' in Eve
假设我有以下文件:
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 的值,添加额外的 'schema' 属性是我绕过 cerberus 的唯一方法,提高 schemaerror/having cerberus 实际上验证了我的字段。但是 eve 似乎并没有真正正确地序列化我字典中的字段。当它传递给 Cerberus 时,它应该是 ObjectId 类型。
我暂时解决这个问题的方法是在 Eve 中操纵我的代码。在第 398 行的序列化(函数)中的 common.py(模块)中,我添加了它检查字段模式是否为 'valueschema':
elif field_type == 'dict' and 'schema' in field_schema['valueschema']:
for subdocument in document[field].values():
serialize(subdocument, schema=field_schema['valueschema']['schema'])
我不应该为 valueschema
使用类型 dict
吗?如果不是,我还应该如何处理这种情况?我不想维护我自己的 Eve 分支,所以如果其他人确实想要 valueschema
类型为 dict
的能力,我应该为此更改提交拉取请求吗?
这已在刚刚发布的 Eve v0.6.4 中修复。
假设我有以下文件:
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 的值,添加额外的 'schema' 属性是我绕过 cerberus 的唯一方法,提高 schemaerror/having cerberus 实际上验证了我的字段。但是 eve 似乎并没有真正正确地序列化我字典中的字段。当它传递给 Cerberus 时,它应该是 ObjectId 类型。
我暂时解决这个问题的方法是在 Eve 中操纵我的代码。在第 398 行的序列化(函数)中的 common.py(模块)中,我添加了它检查字段模式是否为 'valueschema':
elif field_type == 'dict' and 'schema' in field_schema['valueschema']:
for subdocument in document[field].values():
serialize(subdocument, schema=field_schema['valueschema']['schema'])
我不应该为 valueschema
使用类型 dict
吗?如果不是,我还应该如何处理这种情况?我不想维护我自己的 Eve 分支,所以如果其他人确实想要 valueschema
类型为 dict
的能力,我应该为此更改提交拉取请求吗?
这已在刚刚发布的 Eve v0.6.4 中修复。