Проблема с запросом хранилища данных в Google App Engine - PullRequest
0 голосов
/ 03 февраля 2010

У меня следующая проблема:

Я хочу получить все товары категории

class Category(emodel):
      name = db.StringProperty()

class Channel(emodel):
      name = db.StringProperty()
      category = db.ReferenceProperty(Category,collection_name="cat_set")

class Product(emodel):
      name = db.StringProperty()
      channel = db.ReferenceProperty(Channel,collection_name="ch_set")

Теперь я хотел бы написать запрос gql, который извлекает всю прибыль из категории. например:

Product.gql("WHERE channel.category == KEY (:1)", category_selected_key)

Имейте в виду, что каждый канал может часто менять свою категорию, поэтому я хотел бы что-то быстрое, чтобы избежать дополнительной работы для процессора

спасибо

Ответы [ 2 ]

2 голосов
/ 03 февраля 2010

Хранилище данных App Engine не поддерживает объединения (что вы явно пытаетесь сделать здесь). Самым простым способом решения этой проблемы было бы добавление ReferenceProperty из Product в Category с тем же значением, что и у Channel's Product Category, таким образом денормализовав его, чтобы можно было просто запрашивать.

1 голос
/ 03 февраля 2010

С GQL вы не можете выполнить «вложенный» запрос, где вы фильтруете свойство ссылочной сущности, как в SQL (используя соединение).

Поскольку ссылка в вашей сущности Product хранит только ключ ссылочной сущности Channel, вам сначала нужно будет выполнить другой запрос, чтобы получить ключ категории, которую вы пытаетесь получить:

selected_channel = Channel.gql("WHERE category = :1", category_selected_key).get()

category_products = Product.gql("WHERE channel = :1", selected_channel).fetch()
...