2011-04-27 1 views
2

I ont les 2 classes suivantes:Comment extraire des données de deux classes GQL?

class UsersRSS(db.Model): 
    userId = db.IntegerProperty() 
    fileHash = db.StringProperty() 
    added = db.DateTimeProperty(auto_now_add=True) 

class Files(db.Model): 
    fileHash = db.StringProperty() 
    title = db.StringProperty() 
    file = db.BlobProperty() 
    added = db.DateTimeProperty(auto_now_add=True)  

Je dois créer une requête GQL, qui renvoie une données des deux tables:

items = UsersRSS.gql("WHERE userId = :userId ORDER BY date DESC LIMIT 10", userId=user_id) 

Mais chacun item en dehors des champs fileHash et added, devraient contiennent des champs de la deuxième classe - title et file (la correspondance doit être effectuée par le champ fileHash).

Répondre

4

Il n'existe aucun moyen de récupérer différents types de magasin de données à l'aide de la même instruction GQL Select.

Une autre option serait d'utiliser le ReferenceProperty pour créer un grand nombre à une relation entre UsersRSS et Files, refactorisation votre code de cette façon:

class UsersRSS(db.Model): 
    userId = db.IntegerProperty() 
    file = db.ReferenceProperty(Files) 
    added = db.DateTimeProperty(auto_now_add=True) 

class Files(db.Model): 
    fileHash = db.StringProperty() 
    title = db.StringProperty() 
    file = db.BlobProperty() 
    added = db.DateTimeProperty(auto_now_add=True) 

items = UsersRSS.gql("WHERE userId = :userId ORDER BY date DESC LIMIT 10", userId=user_id) 

De cette façon, les propriétés Files seront automatiquement déréférencé en utilisant la notation de points item.file.title:

for item in items: 
    print item.UserID 
    print item.Added 
    print item.file.title #This costs an additional RPC call to Datastore 

pour enregistrer votre application à partir du RPC ReferenceProperty frais généraux allez voir le artic à feuilles persistantes le ReferenceProperty prefetching.

+1

merci! comment ajouter 'file' à' UsersRSS' avec une telle approche? 'file = Files (nom_clé =" z "+ self.request.get ('hash')); file.put(); fileRecord = UsersRSS(); fileRecord.file = fichier; fileRecord.put() 'est l'approche correcte? –

+0

c'est vrai, vous avez probablement oublié de mettre le 'userId' à' fileRecord' avant le 'fileRecord.put()'. – systempuntoout

Questions connexes