Pregunta

Tengo las siguientes 2 clases:

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)    

Necesito crear una consulta GQL, que devolverá los datos de ambas tablas:

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

Pero cada uno item además fileHash y added Los campos deben contener campos de la segunda clase - title y file (La coincidencia debe hacerse por fileHash campo).

¿Fue útil?

Solución

No hay forma de recuperar de DataStore diferentes tipos utilizando los mismos Declaración de selección de GQL.

Otra opción sería usar el ReferenceProperty para crear una relación de muchos a uno entre UsersRSS y Files, refactorizar su código de esta manera:

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 esta manera, el Files Las propiedades se deserreferenciarán automáticamente utilizando el item.file.title Notación de puntos:

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

Para guardar su aplicación de la sobrecarga de RPC de referencia, eche un vistazo al artículo Evergreen ReferenceProperty Preplibatización.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top