app engine python:使用json填充结构化属性会产生错误

时间:2012-09-11 10:28:19

标签: google-app-engine app-engine-ndb

上下文

我有以下数据结构:

class Birthday(ndb.Model):
  day = ndb.IntegerProperty()
  month = ndb.IntegerProperty()
  year = ndb.IntegerProperty()

class User(ndb.Model):
  name = ndb.StringProperty()
  birthday = ndb.StructuredProperty(Birthday)
  # ... other properties

问题

当我尝试在User实例上使用 populate()方法时,它会出错:期望生日实例而不是params字典。

如果我删除了birthday属性,一切正常:用户实例填充了params字典。

populate()方法不应该识别结构化属性并自动填充它们吗?

任何线索?

由于

PS:populate方法也可以使用宽容模式,忽略未知属性,对于params字典有引用。

>>添加了评论

我正在使用通用REST处理程序扩展以访问和更改多种数据类型。扩展必须定义一个方法getModel(),它返回要访问/操作的模型类。模型类必须实现一些方法,即create(cls,params)。

POST处理程序通过以下方式解析params(由AngularJS使用$ resouce发送 - 下面的链接):

# inside the generic REST Handler
params = json.loads(self.request.body, object_hook=self.datetime_decoder) # parse json params
...
self.getModel().create(params) # invokes the create method of the 

模型类通过以下方式实现create方法:

@classmethod
def create(cls, params = None):
    obj = cls()
    if params:
        obj.update(**params)
        obj.put()
        return True, obj
    return False, None

JSON dict 的内容是:

{"name":"Ana Matos","email":"ana.matos@nvd.com","phone":"+35196983465671","birthday":{"day":1,"month":0,"year":1980},"gender":"FEMALE","groups":["2012/2013"],"serviceProviderId":206133}

JSON contens -- firefox screenshot

AngularJS $resource

1 个答案:

答案 0 :(得分:1)

您是否报告错误或要求提供功能? populate()方法要求其参数类型与属性的声明类型匹配,在本例中是属于Birthday实例。

如果您显示要传递给populate()的JSON dict的内容(以及您传递它的确切方式),这将有所帮助。

可能解决方案就像从JSON dict获取'birthday'值并使用它来创建Birthday实例一样简单。但我必须看到你的代码才能确定。