首页 > 解决方案 > 将嵌套数据存储实体转换为 Python 字典的最简单方法是什么?

问题描述

我已尝试阅读此处的文档并遵循此处的答案,但均未奏效。

这是我放入数据存储区的内容:

{'a': 'b', 'c': {'d': 'f'}}

如果我查询它,我会得到:

<Entity('MyKind', 1232141232id) {'a': 'b', 'c': <Entity {'d': 'f'}>}>

我正在使用google-cloud-python(在文档中推荐)而不是ndb所以我不能使用:

from google.appengine.ext import db
db.to_dict(entity)

如果我尝试投射,dict(results[0])我会得到:

{'a': 'b', 'c': <Entity {'d': 'f'}>}

^^ 这几乎是我需要的,除了嵌套实体。

任何建议最好的方法来做到这一点?似乎会有一个功能,但我找不到它。

标签: pythongoogle-cloud-platformgoogle-cloud-datastore

解决方案


所以Entity它本身继承自dict并只在上面添加了几个函数

https://googleapis.dev/python/datastore/latest/_modules/google/cloud/datastore/entity.html#Entity

您的json解决方案可能很好,但这取决于目标是什么。如果您最终只是想转换为 json,那应该没问题,但是您没有捕获entity.key,也许这就是您想要的。我也认为对象和外键json会失败,datetime除非你以某种方式明确处理它们。

您可能需要像这样构建一个 util 函数:

def _coerce_value(v):
    if isinstance(v, Entity):
        return_value[k] = entity_to_dict(v)
    elif isinstance(v, Key):
        return v.id  # or do something else here
    return v

def entity_to_dict(entity):
    return_value = {}
    if entity.key:
        return_value['key'] = _coerce_value(entity.key)
    for k, v in entity.iteritems():
        if isinstance(v, list):  # handle repeated properties                 
            return_value[k] = [_coerce_value(i) for i in v]
        else:
            return_value[k] = _coerce_value(v)
    return return_value

推荐阅读