Appengine数据存储区,多态代码和投影

时间:2015-01-31 10:53:11

标签: python google-app-engine google-cloud-datastore app-engine-ndb

我有一个所有联系人的多态代码

from google.appengine.ext import ndb
from google.appengine.ext.ndb import polymodel

class Contact(polymodel.PolyModel):
    telephone = ndb.StructuredProperty(Telephone, repeated=True)
    email = ndb.StructuredProperty(Email, repeated=True)

电话和电子邮件模型类有两个简单的StringProperty属性:typevalue

我有一个使用此格式的模型Person

class Person(Contact):
    name = ndb.StringProperty()

我想使用投影来减少输出量。所以当我查询父项的属性(即polymodel)时,例如:

qry = Person.query(projection=['telephone.value'])
一切正常。但是,如果我查询Person类的属性,(任何一个)

qry = Person.query(projection=['name'])
qry = Person.query(projection=[Person.name])

我收到InvalidPropertyError: Unknown property name例外。

这是一个ndb的bug,可以查看那种类而不是实际的类吗?

如果有办法,请告诉我(当然一个是不使用多态代码)。感谢。

修改

下面我介绍一个更简单的模型(删除StructuredProperty),它给出了同样的问题:

class Contact(polymodel.PolyModel):
    telephone = ndb.StringProperty()

class Person(Contact):
    name = ndb.StringProperty()

这有效:

qry = Person.query(projection=['telephone'])

这不起作用:

qry = Person.query(projection=['name'])

1 个答案:

答案 0 :(得分:1)

尝试将StructuredProperty与PolyModel结合起来存在很多问题 - 例如,请参阅ndb.StructuredProperty not calling ndb.PolyModel subclass methodsAppEngine NDB PolyModel getting properties

基本上,PolyModel和StructuredProperty的设计倾向于排除它们的组合使用。

我知道你的问题是关于投影查询,但这里的基本问题无疑会妨碍投影查询的工作。