データストアが参照されたエンティティに対して追加のクエリを実行するため、アプリケーションで遅延の問題が発生します。get_value_for_datastore()関数を使用して、単一値のプロパティに対してこれを処理する方法について、良いアドバイスを受けました。ただし、以下のコードに示すように、私のアプリケーションにも1対多の関係があり、これらのエンティティをプリフェッチする方法が見つかりませんでした。その結果、200個のドキュメントとそれに関連するdocumentFiles(> 6000ms)のテーブルを表示しようとすると、許容できない遅延が発生します。
(おそらく、10.000を超えるドキュメントまたはDocumentFileは存在しません)
これを解決する方法はありますか?
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>'