Python 3.x ValueError:未知的protobuf属性类型<;类别';dict'&燃气轮机;尝试放置嵌套的dict/实体时

Python 3.x ValueError:未知的protobuf属性类型<;类别';dict'&燃气轮机;尝试放置嵌套的dict/实体时,python-3.x,google-app-engine,google-cloud-datastore,Python 3.x,Google App Engine,Google Cloud Datastore,我尝试使用Python将嵌套的实体/dict放入数据存储中 metadata_row = dict() metadata_row['batch_id'] = str(uuid1()) metadata_row['table_ok'] = True metadata_row['table_name'] = 'metadata' metadata_row['num_rows'] = 1 metadata_row['violations'] = [] metadata_row['errors'] =

我尝试使用
Python
将嵌套的
实体/dict
放入数据存储中

metadata_row = dict()
metadata_row['batch_id'] = str(uuid1())
metadata_row['table_ok'] = True
metadata_row['table_name'] = 'metadata'
metadata_row['num_rows'] = 1
metadata_row['violations'] = []
metadata_row['errors'] = []

metadata_row['time'] = {}
metadata_row['time']['total_time'] = 82.42656564712524
metadata_row['time']['mod1'] = 5.940682411193848
metadata_row['time']['mod2'] = 19.16786551475525
metadata_row['time']['mod3'] = 31.617812633514404
metadata_row['time']['mod4'] = 0.00038933753967285156
metadata_row['time']['mod5'] = 53.35780310630798

with self.client.transaction():

    entities = [Entity(self.client.key('metadata')) for i in range(len([metadata_row]))]

    for entity, update_dict in zip(entities, [metadata_row]):
        entity.update(update_dict)

    self.client.put_multi(entities)
我使用
数据存储模拟器
对其进行了测试,但出现了以下错误:

ValueError: Unknown protobuf attr type <class 'dict'>

请提出任何改进或替代方案,因为谷歌云数据存储目前没有建议将JSON转换为实体的方法。

不是100%确定,但我怀疑dict中的值应该是可接受的类型(从),其中不包括dict。也许json.dump会将dict值转储并将其存储为字符串?@DanCornilescu我也尝试过
json.dump
,它也可以工作,可能比为内部字典添加一个内部
实体
要好一些。在使用json.dump时面临同样的问题。我认为我们必须将嵌套值转换为“嵌入实体”
client = datastore.Client()
metadata_row['time'] = datastore.Entity(key=client.key('time'))

metadata_row['time']['total_time'] = 82.42656564712524
metadata_row['time']['mod1'] = 5.940682411193848
metadata_row['time']['mod2'] = 19.16786551475525
metadata_row['time']['mod3'] = 31.617812633514404
metadata_row['time']['mod4'] = 0.00038933753967285156
metadata_row['time']['mod5'] = 53.35780310630798

# code for put_multi()
def convert(obj, client, key):
"""
:param obj: dict
:param client: datastore client
:param key: Generated as client.key("your_table", "your_key")
:return: datastore.Entity
"""
if isinstance(obj, list):
    return [convert(item, client, None) for item in obj]
elif isinstance(obj, dict):
    entity = datastore.Entity(key)
    for key in obj:
        entity[key] = convert(obj[key], client, None)
    return entity
else:
    return obj