Comment extraire des données de deux classes GQL?
-
24-10-2019 - |
Question
Je les 2 catégories suivantes:
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 renverra des 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 de fileHash
et added
, doit contenir des champs de la deuxième classe -. title
et file
(correspondant doit être fait par champ fileHash
)
La solution
Il n'y a aucun moyen de récupérer différents types de magasin de données en utilisant la même GQL instruction Select .
serait d'utiliser le ReferenceProperty pour créer une relation many-to-one 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 de Files
seront déréférencé automatiquement en utilisant la notation dot 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 ont en tête un regard à l'article à feuilles persistantes ReferenceProperty préchargement .