我使用NDB和一个名为MBObject的Expando模型,因为我动态地创建对象,没有固定的方案。我从字典中创建对象:
dic = {"groupName" : "my group",
"members" : [{"memberId" : "1"}, {"memberId" : "2"}]}因此,我想要做的是创建一个具有名为LocalStructuredProperty of MBObjects的属性的组对象。(所有对象都是ndb.Expando的子类MBObject)
但是,似乎没有一种动态地指定第二部分的方法,而且我得到了错误:
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),我将一个属性设置为一个列表,我如何使它知道我想要一个LocalStructuredProperty或JsonProperty,因为现在它不知道如何处理这个列表。
发布于 2012-11-14 10:36:51
NDB扩展模型使用GenericProperty设置数据,它只支持以下类型: int、long、float、bool、str、unicode、datetime、Key、BlobKey、GeoPt、User、None。
要解决这个问题:如果您知道members的所有属性和名称,那么您可以使用带有预定义属性(在文档中描述)的扩张型模型为LocalStructuredProperty。但是,如果您不知道这一点(这很有意义,因为您正在使用扩张性),那么最好的选择可能是手动将这些成员序列化到JSON中,并将它们保存为一个字符串。
发布于 2012-11-15 16:52:08
这个问题可能会被发现:http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=216
修复将出现在下一个版本的AppEngine SDK中。看起来您可以首先将Expando模型存储在Expando模型中(取自page页面):
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。
https://stackoverflow.com/questions/13370964
复制相似问题