首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将嵌套的Datastore实体转换为Python字典的最简单方法是什么?

将嵌套的Datastore实体转换为Python字典的最简单方法是什么?
EN

Stack Overflow用户
提问于 2019-12-31 08:03:24
回答 2查看 598关注 0票数 1

我试着阅读文档here并按照答案here操作,但都不起作用。

下面是我放入数据存储中的内容:

代码语言:javascript
复制
{'a': 'b', 'c': {'d': 'f'}}

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

代码语言:javascript
复制
<Entity('MyKind', 1232141232id) {'a': 'b', 'c': <Entity {'d': 'f'}>}>

我使用的是google-cloud-python (文档中的recommended ),而不是ndb,所以我不能使用:

代码语言:javascript
复制
from google.appengine.ext import db
db.to_dict(entity)

如果我尝试强制转换dict(results[0]),我会得到:

代码语言:javascript
复制
{'a': 'b', 'c': <Entity {'d': 'f'}>}

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

有什么建议是最好的方法吗?似乎会有一个函数来处理这个问题,但我就是找不到。

EN

回答 2

Stack Overflow用户

发布于 2019-12-31 08:07:16

到目前为止,我找到的最好的解决方案是this,但不确定这是否会打破任何边缘情况。

代码语言:javascript
复制
import json
json.loads(json.dumps(data), parse_int=str)
票数 1
EN

Stack Overflow用户

发布于 2020-01-07 01:52:08

因此,Entity本身继承自dict,只在顶部添加了几个函数

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

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

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59538154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档