Wie extrahiere ich Daten aus zwei GQL -Klassen?
-
24-10-2019 - |
Frage
Ich habe die folgenden 2 Klassen:
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)
Ich muss eine GQL -Abfrage erstellen, die eine Daten aus beiden Tabellen zurückgibt:
items = UsersRSS.gql("WHERE userId = :userId ORDER BY date DESC LIMIT 10", userId=user_id)
Aber jeder item
Außerdem fileHash
und added
Felder sollten Felder aus der zweiten Klasse enthalten - title
und file
(Matching sollte von durchgeführt werden von fileHash
aufstellen).
Lösung
Es gibt keine Möglichkeit, sich von DataStore -verschiedenen Arten mit demselben abzurufen GQL SELECT -Anweisung.
Eine andere Option wäre die Verwendung des Referenzproperschaft eine viele zu eins-eins-zu-Eins-Beziehung zwischen UsersRSS
und Files
, refactorieren Sie Ihren Code auf diese Weise:
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)
Auf diese Weise die Files
Eigenschaften werden automatisch mit der item.file.title
Punktnotation:
for item in items:
print item.UserID
print item.Added
print item.file.title #This costs an additional RPC call to Datastore
Um Ihre App vor dem ReferenceProperty RPC -Overhead zu speichern Referenzproperschaftsvorabfassungen.