我在GAE中使用db.ReferenceProperty和PolyModel时遇到了麻烦。如果我有两个派生自基本PolyModel的模型,并且每个模型都引用另一个“容器”模型,则容器上的集合包含PolyModel,而不仅仅是您期望的那个。这是一个显示问题的测试用例:
from google.appengine.ext import db
from google.appengine.ext.db import polymodel
class MyContainer(db.Model):
name = db.StringProperty(default='mycontainer', multiline=False)
class MyBaseModel(polymodel.PolyModel):
name = db.StringProperty(default='mybasemodel', multiline=False)
class MyModelOne(MyBaseModel):
container = db.ReferenceProperty(MyContainer, collection_name='model_ones')
class MyModelTwo(MyBaseModel):
container = db.ReferenceProperty(MyContainer, collection_name='model_twos')
print "Beginning test.\n"
c = MyContainer(name="Container")
c.put()
one = MyModelOne(name="One", container=c)
two = MyModelTwo(name="Two", container=c)
one.put()
two.put()
print "Ones:"
for o in c.model_ones:
print o.name
print "\nTwos:"
for o in c.model_twos:
print o.name
输出:
Beginning test.
Ones:
One
Two
Twos:
One
Two
我在设置ReferenceProperties时遗漏了什么,或者这是预期的行为?
答案 0 :(得分:2)
所以看一下SDK source,看起来_ReverseReferenceProperty(将集合转换为Query对象)似乎没有尝试处理PolyModel。有关问题跟踪器的一些相关投诉,here和here。
IMO,如果这是一个已知的限制,那么应该在PolyModel文档的某个地方提到它。
修改:无收集的解决方法是这样的:
for o in MyModelOne.all().filter('container =', c):