所以说我有以下文件:
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
,我应该提交一个拉动请求吗?
答案 0 :(得分:1)
已经使用刚刚发布的Eve v0.6.4修复了这个问题。