Проблема с запросом хранилища данных Google App Engine

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

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

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)

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

Спасибо


person LXG    schedule 03.02.2010    source источник


Ответы (2)


С 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()
person Tom van Enckevort    schedule 03.02.2010

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

person Nick Johnson    schedule 03.02.2010