首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GAE Expando动态设置属性类型

GAE Expando动态设置属性类型
EN

Stack Overflow用户
提问于 2012-11-13 23:56:20
回答 2查看 1.1K关注 0票数 2

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

代码语言:javascript
复制
dic = {"groupName" : "my group",
       "members" : [{"memberId" : "1"}, {"memberId" : "2"}]}

因此,我想要做的是创建一个具有名为LocalStructuredProperty of MBObjects的属性的组对象。(所有对象都是ndb.Expando的子类MBObject)

但是,似乎没有一种动态地指定第二部分的方法,而且我得到了错误:

代码语言:javascript
复制
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,但问题仍然是一样的:如何动态地告诉它我希望它是特定类型的属性?

tl;:如果我有一个Expando模型,我做了setattr(object, key, a_list),我将一个属性设置为一个列表,我如何使它知道我想要一个LocalStructuredPropertyJsonProperty,因为现在它不知道如何处理这个列表。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-14 10:36:51

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-11-15 16:52:08

这个问题可能会被发现:http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=216

修复将出现在下一个版本的AppEngine SDK中。看起来您可以首先将Expando模型存储在Expando模型中(取自page页面):

代码语言:javascript
复制
def test_expando_in_expando_with_lists(self):
        """Passes"""
        class B(ndb.Expando):
            pass
        class A(ndb.Expando):
            pass
        a = A(a1 = [B(b1 = [0,1,2,3]),B(b2='b2test')])
        new_a = A(**a.to_dict())
        self.assertEqual(a, new_a)

在上面的示例中,我将查看a.to_dict()的结构,并验证与您自己的字典对象相比,字典对象的外观如何。而且,我相信这将使StructuredProperty,而不是LocalStructuredProperty。

如果可以预定义属性类型,则此问题修复了一个类似的bug:http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=207

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13370964

复制
相关文章

相似问题

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