【问题标题】:Appengine datastore, polymodel, and projectionAppengine 数据存储、多模型和投影
【发布时间】:2015-01-31 10:53:10
【问题描述】:

我有一个适用于所有联系人的多模型

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 的错误,用于查看种类而不是实际类?

请让我知道是否有解决方法(当然一种方法是不使用多模型)。谢谢。

编辑:

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

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

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

这行得通:

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

这不起作用:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我不认为 PolyModel 和 StructuredProperty 的结合对我的问题有任何影响。
    • 确实如此。阅读 guido 关于使用 PolyModel 支持 StructuredProperties 的评论。 NDB 真的不支持这种组合。如果您开始研究元类的使用方式以及 PolyModel 的实现方式,您将意识到您正在尝试做的事情目前行不通。我建议你记录一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2019-11-19
    相关资源
    最近更新 更多