1

これは私の前の質問のフォローアップです。

ReferencePropertyを使用してモデルを設定しました。

class User(db.Model):
    userEmail = db.StringProperty()

class Comment(db.Model):
    user = db.ReferenceProperty(User, collection_name="comments")
    comment = db.StringProperty(multiline=True)

class Venue(db.Model):
    user = db.ReferenceProperty(User, collection_name="venues")
    venue = db.StringProperty()

データストアでは、ユーザーの下に次のエントリがあります。

Entity Kind: User
Entity Key: ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGBUM
ID: 21
userEmail: az@example.com

そして会場の下:

Entity Kind: Venue
Entity Key: ag1oZWxsby0xLXdvcmxkcgsLEgVWZW51ZRhVDA
ID: 85
venue (string): 5 star venue
user (Key): ag1oZWxsby0xLXdvcmxkcgoLEgRVc2VyGBUM
User: id=21

hw.pyこのようにアイテムを表示しようとしています

query = User.all()
    results = query.fetch(10)
    self.response.out.write("<html><body><ol>")
    for result in results:
        self.response.out.write("<li>")
        self.response.out.write(result.userEmail)
        self.response.out.write(result.venues)
        self.response.out.write("</li>")
    self.response.out.write("</ol></body></html>")

この行は機能します:

        self.response.out.write(result.userEmail)

しかし、この行は機能しません:

        self.response.out.write(result.venues)

しかし、vonPetrushevの答え によると、これに関連するものをresult.venuesつかむ必要があります。venueuserEmail

これが紛らわしい場合は申し訳ありません。withにリンクされているテーブルにアクセスしようとしてuserEmailいますReferencePropertyVenueリンクされたテーブルはとですCommentVenue内または内のアイテムにアクセスするにはどうすればよいCommentですか?ありがとう。

4

1 に答える 1

3

venues実際にはクエリオブジェクトです。したがって、それをフェッチまたは反復する必要があります。

self.response.out.write(result.venues)行をループに置き換えてみてください。

query = User.all()
users = query.fetch(10)
self.response.out.write("<html><body><ol>")
for user in users:
    self.response.out.write("<li>")
    self.response.out.write(user.userEmail)
    self.response.out.write("<ul>")
    # Iterate over the venues
    for venue in user.venues:
        self.response.out.write("<li>%s</li>" % venue.venue)
    self.response.out.write("</ul></li>")
self.response.out.write("</ol></body></html>")

ただし、これはあまり拡張性がありません。ユーザーが10人の場合、11個のクエリが実行されます。Appstatsを使用して、このようなパフォーマンスの問題を探していることを確認してください。行うRPC呼び出しの数を最小限に抑えるようにしてください。

より良い解決策は、ユーザーの電子メールを非正規化して会場の種類に保存することです。そうすれば、会場情報とユーザーの電子メールを印刷するために必要なクエリは1つだけです。

于 2010-11-30T17:05:56.023 に答える