2011-05-15 2 views
2

Salut, je suis en train de la liste des listes de lecture wich contient des chansons d'un artiste donné pour que j'ai le keyname, mes modèles sont:aide requête datastore

**playlist** 
songs = db.ListProperty(db.Key) 

**Song** 
artist = db.ReferenceProperty(Artist,collection_name='songs') 

**Artist** 
Key Name = john-lennon 

si playlist contient une liste des clés de la chanson, et chanson contient une référence à l'artiste.

toute aide serait appréciée, Mes requêtes ont toujours été simple à ce jour si im un peu perdu maintenant :-)

Répondre

3

Vous ne pouvez pas vraiment faire des requêtes comme celui-ci avec GAE. Le magasin de données n'est pas une base de données relationnelle et ne fait pas des choses comme JOINs.

Le mieux que vous pouvez faire est d'obtenir toutes les chansons dont l'artiste est John Lennon, puis trouver la liste de lecture pour les chansons:

songs = GqlQuery('SELECT __key__ FROM song WHERE artist = :1', 'john-lennon') 
playlists = GqlQuery('SELECT * FROM playlist WHERE songs IN :1', songs) 

Notez que même cela aura des problèmes si vous avez plus de 30 chansons de John Lennon - comme le dit la documentation:

Remarque: Les opérateurs IN et! = utilisent plusieurs requêtes en coulisses. Par exemple, l'opérateur IN exécute une requête de banque de données sous-jacente distincte pour chaque élément de la liste. Les entités renvoyées résultent du produit croisé de toutes les requêtes de banque de données sous-jacentes et sont dédupliquées. Un maximum de 30 requêtes de banque de données est autorisé pour toute requête GQL unique.