0

J'ai le problème suivant:Google App Engine Datastore problème de requête

Je voudrais récupérer tous les produits d'une catégorie

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") 

Maintenant, je voudrais écrire une requête gql qui retrive tous profite d'une catégorie. par exemple:

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

Gardez à l'esprit que chaque canal peut changer souvent sa catégorie, donc je voudrais quelque chose de rapide pour éviter un travail supplémentaire pour cpu

grâce

Répondre

1

Avec GQL vous pouvez » t faire une requête 'imbriquée' où vous filtrez sur la propriété d'une entité référencée comme le ferait SQL (en utilisant une jointure).

Parce que la référence dans votre entité produit ne stocke que la clé de l'entité canal référencé vous devez faire une autre requête d'abord pour récupérer la clé de la catégorie que vous essayez de récupérer:

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

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

Le Le magasin de données App Engine ne prend pas en charge les jointures (que vous essayez implicitement de faire, ici). Le moyen le plus simple de résoudre ce problème serait d'ajouter un ReferenceProperty de Product à Category, avec la même valeur que la Category du Channel du Product, donc de le dénormaliser afin de pouvoir interroger simplement.