Я моделировал много-много отношений в gae, используя классический ListProperty
экземпляров db.Key.
class Foo(db.Model):
name = db.StringProperty()
_bars = db.ListProperty(db.Key)
@property
def bars(self):
return Bar.gql("WHERE __key__ in :1", self._bars)
class Bar(db.Model):
name = db.StringProperty()
@property
def bands(self):
return Foo.gql("WHERE _bars = :1", self.key())
class QueryTest(unittest.TestCase):
def setUp(self):
db.delete(Foo.all().run())
db.delete(Bar.all().run())
def test_query_no_notification(self):
bar_1 = Bar(name="asdf")
bar_1.put()
bar_2 = Bar(name="qwer")
bar_2.put()
foo = Foo()
foo.put()
self.assertEqual(len([bar for bar in foo.bars]), 0)
def test_query_with_bars(self):
bar_1 = Bar(name="asdf")
bar_1.put()
bar_2 = Bar(name="qwe")
bar_2.put()
foo = Foo()
foo._bars.append(bar_1.key())
foo.put()
self.assertEqual(len([bar for bar in foo.bars]), 1)
В приведенном выше коде первый тест не пройден. Когда _bars
ListProperty пусто, Bar.gql("WHERE __key__ in :1", self._bars)
возвращает все объекты Bar (вместо ни одного).
Однако, если _bars
содержит хотя бы один элемент, запрос выполняется нормально.
Мне любопытно, если это ошибка в GAE или неправильный способ написания запроса ...
Спасибо