Google app engine 如何在Google App Engine上继承db.ReferenceProperty

Google app engine 如何在Google App Engine上继承db.ReferenceProperty,google-app-engine,python-2.7,google-cloud-datastore,Google App Engine,Python 2.7,Google Cloud Datastore,我的数据存储中有类似的内容: class Referenced(db.Model): foo = db.StringProperty() class Parent(db.Model): ref_key = db.ReferenceProperty(Referenced, collection_name='items') class Child(Parent): foo = db.StringProperty() 那么,现在如果我创建一个引用的实例和一个子引用该实例,

我的数据存储中有类似的内容:

class Referenced(db.Model):
    foo = db.StringProperty()

class Parent(db.Model):
    ref_key = db.ReferenceProperty(Referenced, collection_name='items')

class Child(Parent):
    foo = db.StringProperty()
那么,现在如果我创建一个
引用的
实例和一个
引用该实例,如下所示:

def get_referenced():
    referenced = Referenced()
    referenced.put()
    item = Child(ref_key=referenced.key())
    item.put()
    return referenced
并尝试访问被引用的
items
我将得到一个空列表,因为appengine正在使用
ref_key
等于
referenced.key()
查询数据存储中的
Parent
实例,因此它返回一个空列表

所以我的问题是,这是一个bug吗?也许我做错了什么。我有没有办法做到这一点


多谢各位

不,这不是一个bug。另一方面,由于子项和父项将具有相同的集合名称项,因此最终会导致反向引用的名称冲突

您需要使用PolyModel来执行您想要的操作


如果你要出发,那么你应该马上停下来,转到ndb。如果您有一个现有的代码库,那么忽略这一点建议。

不,这不是一个bug。另一方面,由于子项和父项将具有相同的集合名称项,因此最终会导致反向引用的名称冲突

您需要使用PolyModel来执行您想要的操作


如果你要出发,那么你应该马上停下来,转到ndb。如果您有一个现有的代码库,那么忽略这一点建议。

所以您告诉我这是不可能的。唯一可能的解决方案是为
子项
提供一个新的db.ReferenceProperty字段。我有一个基于
db
的大型项目,我们必须在子类中定义引用属性。我们想要命名集合,对于引用同一个类的每个类,它们必须不同,否则会得到重复的集合名称。我们找不到绕过它的办法。如果您使用
ndb
这些当然都不相关。同时,引用属性的绑定在基类定义中完成。你可以考虑使用PolyModel作为父类的基类,然后它就可以工作了。好的,非常感谢!遗憾的是,我一直在使用
db
,但谢谢!如果将父对象的基本模型更改为db.PolyModel,则可以执行所需操作。这还意味着您可以获取单个集合中引用的所有父/子引用。使用您当前拥有的继承模型意味着您需要两个集合名称和两个单独的查询来获取所有引用的
父对象
引用的
和所有引用的
子对象
引用的
引用的
。所以您告诉我这是不可能的。唯一可能的解决方案是为
子项
提供一个新的db.ReferenceProperty字段。我有一个基于
db
的大型项目,我们必须在子类中定义引用属性。我们想要命名集合,对于引用同一个类的每个类,它们必须不同,否则会得到重复的集合名称。我们找不到绕过它的办法。如果您使用
ndb
这些当然都不相关。同时,引用属性的绑定在基类定义中完成。你可以考虑使用PolyModel作为父类的基类,然后它就可以工作了。好的,非常感谢!遗憾的是,我一直在使用
db
,但谢谢!如果将父对象的基本模型更改为db.PolyModel,则可以执行所需操作。这还意味着您可以获取单个集合中引用的所有父/子引用。使用您当前拥有的继承模型意味着您需要两个集合名称和两个单独的查询来获取所有引用的
父项
s
引用的
和所有引用的
子项
引用的
引用的