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,应该抓住venue与 this 相关的内容userEmail

抱歉,如果这令人困惑:我只是想访问与userEmailwith链接的表ReferenceProperty。链接表是VenueComment。如何访问 inVenue或 in 中的项目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 调用的数量。

更好的解决方案可能是将用户的电子邮件非规范化并存储在 Venue 类型上。这样,您只需要一个查询即可打印场地信息和用户电子邮件。

于 2010-11-30T17:05:56.023 回答