GAE Expando动态设置属性类型

2024-09-30 14:18:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

但是,似乎没有一种方法可以动态地指定第二部分,我遇到了错误:

^{pr2}$

所以基本上我得到了一个成员列表,并尝试将其设置为对象的属性,并希望它自动实现我想要一个重复的LocalStructuredProperty。所以很明显,我知道问题出在哪里了,它还不够聪明,不能独自处理。问题是,我该如何处理?在

如果它不能用于LocalStructuredProperty,那么我也可以使用ndb.JsonProperty公司,但问题仍然相同:如何动态地告诉它我希望它是某个类型的属性?在

tl;dr:如果我有一个Expando模型,setattr(object, key, a_list),在这里我将一个属性设置为一个列表,我如何让它知道我想要一个LocalStructuredProperty或一个JsonProperty,因为现在它不知道该如何处理该列表。在


Tags: 对象模型列表属性group公司动态members
2条回答

此问题可能是由于:http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=216

修复将在appenginesdk的下一个版本中进行。看起来您应该先将Expando模型存储在Expando模型中(取自“问题”页面):

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()的结构,并验证dictionary对象与您自己的dictionary对象的比较。另外,我相信这将生成一个StructuredProperty,而不是LocalStructuredProperty。在

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

{data{datebko,只支持long-date,model^的类型。在

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

相关问题 更多 >