Come estrarre i dati da due classi GQL?
-
24-10-2019 - |
Domanda
Ho i seguenti 2 classi:
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)
Ho bisogno di creare una query GQL, che restituirà un insieme di dati da entrambe le tabelle:
items = UsersRSS.gql("WHERE userId = :userId ORDER BY date DESC LIMIT 10", userId=user_id)
Ma ogni item
oltre campi fileHash
e added
, dovrebbe contenere campi dalla seconda classe -. title
e file
(corrispondenza deve essere eseguita da campo fileHash
)
Soluzione
Non c'è alcun modo per recuperare dal datastore diversi tipi utilizzando la stessa GQL Select .
Un'altra opzione sarebbe utilizzando il ReferenceProperty per creare una relazione molti-a-uno tra UsersRSS
e Files
, refactoring il codice in questo modo:
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)
In questo modo, le proprietà Files
verranno dereferenziati automaticamente utilizzando la notazione 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
Per salvare l'App dalla RPC ReferenceProperty in testa di dare un'occhiata all'articolo evergreen ReferenceProperty prefetching .