2つのGQLクラスからデータを抽出する方法は?
-
24-10-2019 - |
質問
次の2つのクラスがあります。
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)
両方のテーブルからデータを返すGQLクエリを作成する必要があります。
items = UsersRSS.gql("WHERE userId = :userId ORDER BY date DESC LIMIT 10", userId=user_id)
しかし、それぞれ item
そのほか fileHash
と added
フィールドには、2番目のクラスのフィールドが含まれている必要があります - title
と file
(マッチングはによって行う必要があります fileHash
分野)。
解決
同じものを使用して、DataStoreからさまざまな種類を取得する方法はありません GQL Selectステートメント.
別のオプションは、を使用することです ReferenceProperty の間の多くの関係を作成するため UsersRSS
と Files
, 、この方法でコードをリファクタリングします。
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)
このように、 Files
プロパティは、を使用して自動的に再参入されます 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
ReferenceProperty RPCオーバーヘッドからアプリを保存するには、常緑記事をご覧ください ReferencePropertyプリフェッチ.
所属していません StackOverflow