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 を Product から 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 に答える