Gql получить всех детей предка без самого предка - PullRequest
1 голос
/ 26 марта 2011

Я пытаюсь создать форум, подобный платформе на GAE.

Сначала я должен упомянуть: я немного новичок в GAE.

Я хочу вытащить все ответы на конкретный пост. Пока что структура выглядит так:

- Forum
--- Post
----- Reply ( = Post with Post as a parent )

Ответы - это просто сообщения с сообщением в качестве родителя (вместо форума в качестве родителя).

Проблема начинается, когда я пытаюсь извлечь все ответы, возвращаемые результаты включают самого предка.

Как мне добиться того же самого без самого предка? (Могу также упомянуть, что я искал решение, но не нашел его)

Edit:

Мой запрос выглядит так:

replies = db.GqlQuery("SELECT * FROM Post WHERE ANCESTOR IS :1", post)

Спасибо!

Обновление:

Ну, я нашел способ:

db.GqlQuery("SELECT * FROM Post WHERE ANCESTOR IS :1 AND __key__ != :2", post, post.key())

просто запросите и исключите самого предка в предложении where!

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

Если у вас есть родительский ключ, вам не нужно извлекать родительский объект сообщения.Если у вас есть строковая версия ключа родительского сообщения:

parent_post = db.Key(string_version_of_the_key)
replies = Post.all().ancestor(parent_post).fetch(num_to_fetch)

Если у вас есть идентификатор или имя ключа родительского сообщения:

parent_post = db.Key.from_path('Post', id_or_key_name)
replies = Post.all().ancestor(parent_post).fetch(num_to_fetch)

См. Документы по ключу класс для более подробной информации.

2 голосов
/ 28 марта 2011

Предлагаемое решение использует фильтр неравенства в запросе. Фильтры неравенства не поддерживаются базовым хранилищем данных и внутренне переводятся в два отдельных запроса, например:

SELECT * FROM Post WHERE ANCESTOR IS :1 AND __key__ < :2
SELECT * FROM Post WHERE ANCESTOR IS :1 AND __key__ > :2

Очевидно, это существенно менее эффективно. Гораздо более простой и эффективный вариант - просто получить все результаты, а затем отбросить одну ненужную сущность.

1 голос
/ 26 марта 2011

Я не знаю, ваш код на Python или нет, но ваш запрос должен выглядеть примерно так:

replies = Reply.ancestor(post).fetch(num_to_fetch)

, который точно не вернет post вВаш результирующий набор, так как сущность не может быть ее собственным предком.

...