0

我有以下问题:

我想检索一个类别的所有产品

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)

请记住,每个频道都可以经常更改其类别,所以我想要一些快速的东西以避免额外的 CPU 工作

谢谢

4

2 回答 2

2

App Engine 数据存储区不支持连接(您在此处隐式尝试执行此操作)。解决此问题的最简单方法是将 Product 中的 ReferenceProperty 添加到 Category,其值与 Product 的 Channel 的 Category 相同,从而对其进行非规范化,以便您可以简单地查询。

于 2010-02-03T11:58:39.917 回答
1

使用 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()
于 2010-02-03T11:34:18.790 回答