python - GAE Expando 动态设置属性类型

标签 python google-app-engine

我正在使用 NDB 和一个名为 MBObject 的 Expando 模型,因为我正在动态创建对象,没有固定的方案。我从字典创建对象:

dic = {"groupName" : "my group",
       "members" : [{"memberId" : "1"}, {"memberId" : "2"}]}

所以我想要做的是创建一个组对象,它有一个名为members的属性,其中members是MBObjects的LocalStructuredProperty。 (所有对象都是 MBObject 的,ndb.Expando 的子类)

但是,似乎没有办法动态指定第二部分,并且我收到错误:

def config_obj_from_dic(dictionary):
    object = MBObject()
    for key, value in dictionary.iteritems():
        if isinstance(value, list):
            objects = list()
            for dic in value:
                objects.append(config_obj_from_dic(dic))
            value = objects
        setattr(object, key, value)
    return object

所以基本上我最终得到了一个成员列表,并尝试将其设置为对象的属性,并希望它自动意识到我想要一个重复的 LocalStructuredProperty。很明显,我知道问题出在哪里,它本身不够聪明,无法解决这个问题。问题是,我该如何让它处理这个问题?

如果它不能与 LocalStructuredProperty 一起使用,那么我也可以使用 ndb.JsonProperty,但这仍然是同样的问题:我如何动态地告诉它我希望它成为 a 的属性某种类型?

tl;dr: 如果我有一个 Expando 模型,并且我执行 setattr(object, key, a_list),其中我将属性设置为列表,那么如何我可以让它知道我想要一个 LocalStructuredPropertyJsonProperty,因为现在它不知道如何处理该列表。

最佳答案

NDB Expando 模型使用 GenericProperty设置数据,仅支持以下类型:int、long、float、bool、str、unicode、datetime、Key、BlobKey、GeoPt、User、None。

要解决此问题:如果您知道成员的所有属性和名称,那么您可以使用具有预定义属性(在文档中描述)的扩展模型作为LocalStructuredProperty。但是,如果您不知道这一点(这很有意义,因为您使用的是 Expando),那么最好的选择可能是手动将这些成员序列化为 JSON,并将它们作为字符串保存在 Expando 属性中。

关于python - GAE Expando 动态设置属性类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13370964/

相关文章:

python - 有没有为 SQL 和 NoSQL 提供数据库抽象层的 python Web 应用程序框架?

java - "Failed to initialize App Engine SDK at [path]"是什么意思,如何解决?

google-app-engine - 如何使用Firebase Storage上传到现有的Google云存储桶?

python - 操作 2 个以上的数据框

python - Flask-Sqlalchemy 访问不同的架构?

Python正则表达式问题

python - 迁移到 Python27 后的数据存储 'Response too large error'

python - 如何使用 Pandas 仅在值之间进行插值(在列中最后一个 NaN 之前和之后停止)?

python - 无法使用代理设置连接到 SOAP API

python - appcfg.py upload_data 在 Windows 上忽略 --oauth2 选项