データストアが参照されたエンティティに対して追加のクエリを実行するため、アプリケーションに待ち時間の問題があります。私はgood adviceを受け取っています。これは、get_value_for_datastore()関数を使用して単一値のプロパティに対してこれを処理する方法です。しかし、私のアプリケーションも以下のコードに示すように1対多の関係を持っています。これらのエンティティをプリフェッチする方法が見つかりませんでした。結果として、200個のドキュメントとそれに関連するドキュメントファイル(> 6000ミリ秒)のテーブルを表示しようとすると、許容できない遅延が発生します。データストア内で1対多のクエリを最適化する方法
これを解決する方法はあります(おそらく以上10.000ドキュメントまたはDocumentFilesがあってはなりませんか)?
models.py
class Document(db.Expando):
title = db.StringProperty()
lastEditedBy = db.ReferenceProperty(DocUser, collection_name = 'documentLastEditedBy')
...
class DocUser(db.Model):
user = db.UserProperty()
name = db.StringProperty()
hasWriteAccess= db.BooleanProperty(default = False)
isAdmin = db.BooleanProperty(default = False)
accessGroups = db.ListProperty(db.Key)
...
class DocumentFile(db.Model):
description= db.StringProperty()
blob = blobstore.BlobReferenceProperty()
created = db.DateTimeProperty() # needs to be stored here in relation to upload/download of everything
document = db.ReferenceProperty(Document, collection_name = 'files')
@property
def link(self):
return '<a href="/file/serve/%s">%s</a>' % (self.key().id(),self.blob.filename)
...
main.py
docUsers = DocUser.all()
docUsersNameDict = dict([(i.key(), i.name) for i in docUsers])
documents = Document.all()
for d idocuments:
out += '<td>%s</td>' % d.title
docUserKey = Document.lastEditedBy.get_value_for_datastore(d)
out +='<td>%s</td>' % docUsersNameDict.get(docUserKey)
out += '<td>'
# Creates a new query for each document, resulting in unacceptable latency
for file in d.files:
out += file.link + '<br>'
out += '</td>'
ありがとうございます。これを逆正規化する。それはドキュメントで約束されたクリーンなデザインを使用することができないが、それは人生が時々ある方法です。 –