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的东西,或者是这种预期的行为?
谢谢,这证实了我所看到的。我同意文档缺乏,我可能会提交一个错误。你的过滤器工作,这是我的解决方案。在我上面的示例中,如何获取所有MyBaseModel,而不使用相关的MyModelOne和MyModelTwo? MyBaseModel.all()。filter(“_ class!=”,“MyModelOne”)不起作用。 – Hoser
AFAIK,你不能。过滤kind = MyBaseModel或class = MyBaseModel将匹配所有子类。 'filter(“class!=”,“MyModelOne”)'应该排除MyModelOne,但是你需要多个不相等的过滤器来排除所有的子类。解决方法是手动将类名作为默认值包含在基础模型上,并在子模型上设置不同的默认值。然后你可以过滤。 –