2011-09-29 36 views
0

我在使用GAE中的PolyModel时使用db.ReferenceProperty时遇到了问题。如果我有两个从基础PolyModel派生的模型,并且每个模型都引用了另一个“容器”模型,则容器上的集合包含PolyModel,而不仅仅是您期望的那个。下面是一个显示问题测试用例:GAE/Python:collection_name不适用于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的东西,或者是这种预期的行为?

回答

2

因此,看着SDK source,似乎_ReverseReferenceProperty(它将集合转换为Query对象)不会尝试处理PolyModels。关于问题跟踪器有几个相关的投诉,herehere

IMO,如果这是一个已知的限制,它应该在PolyModel文档中的某处提及。

编辑:集合少的解决方法是这样的:

for o in MyModelOne.all().filter('container =', c):

+0

谢谢,这证实了我所看到的。我同意文档缺乏,我可能会提交一个错误。你的过滤器工作,这是我的解决方案。在我上面的示例中,如何获取所有MyBaseModel,而不使用相关的MyModelOne和MyModelTwo? MyBaseModel.all()。filter(“_ class!=”,“MyModelOne”)不起作用。 – Hoser

+0

AFAIK,你不能。过滤kind = MyBaseModel或class = MyBaseModel将匹配所有子类。 'filter(“class!=”,“MyModelOne”)'应该排除MyModelOne,但是你需要多个不相等的过滤器来排除所有的子类。解决方法是手动将类名作为默认值包含在基础模型上,并在子模型上设置不同的默认值。然后你可以过滤。 –