¿Cómo extraer datos de dos clases de GQL?
-
24-10-2019 - |
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).
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.