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)

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top