1

语境

我有以下数据结构:

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()方法时,它给出了一个错误:期望一个生日实例而不是参数字典。

如果我删除生日属性,一切正常:用户实例填充了参数字典。

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

有什么线索吗?

谢谢

PS:populate 方法也可以使用宽容模式,在这种模式下它会忽略在 params 字典中有引用的未知属性。

>>添加评论

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

POST 处理程序通过以下方式解析参数(由 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 内容——firefox 截图

AngularJS $资源

4

1 回答 1

1

您是报告错误还是请求功能?populate() 方法要求其参数类型与属性的声明类型相匹配,在本例中是一个生日实例。

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

可能解决方案就像从 JSON 字典中获取“生日”值并使用它来创建生日实例一样简单。但是我必须查看您的代码才能确定。

于 2012-09-11T21:42:10.027 回答