Отношение многие ко многим в GAE.Неверный запрос - PullRequest
1 голос
/ 03 апреля 2011

Я моделировал много-много отношений в 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 или неправильный способ написания запроса ...

Спасибо

1 Ответ

1 голос
/ 04 апреля 2011

Это, конечно, выглядит аномально. Можете ли вы запустить AppStats и посмотреть, какие базовые запросы выполняются?

Однако то, что вы делаете, не самый эффективный способ. Когда вы запускаете запрос типа SELECT * FROM Foo WHERE bar in :1, SDK разбивает его на один запрос на равенство для каждого элемента в списке и выполняет их отдельно. Однако вы пытаетесь искать элементы по ключу, и в хранилище данных есть встроенный метод для этого. Заменить текущий запрос следующим:

return Bar.get(self._bars)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...