GAE / Python: collection_name не работает с Polymodel? - PullRequest
0 голосов
/ 29 сентября 2011

У меня проблемы с использованием db.ReferenceProperty с PolyModel в GAE.Если у меня есть две модели, полученные из базовой модели 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 или это ожидаемое поведение?

1 Ответ

2 голосов
/ 29 сентября 2011

Итак, глядя на источник SDK , выясняется, что _ReverseReferenceProperty (который преобразует коллекции в объекты Query) не предпринимает никаких попыток обработки PolyModels.Есть несколько связанных жалоб на систему отслеживания ошибок: здесь и здесь .

IMO, если это известное ограничение, его следует упомянуть где-то в PolyModelдокументы.

Редактировать : Обход без сбора будет выглядеть примерно так:

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

...