【问题标题】:How to access items in a model with ReferenceProperty?如何使用 ReferenceProperty 访问模型中的项目?
【发布时间】:2010-11-30 16:53:17
【问题描述】:

这是对my previous question的跟进。

我使用 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)

per vonPetrushev's answer result.venues 应该获取与此userEmail 关联的venue

对不起,如果这令人困惑:我只是想访问与ReferenceProperty 链接到userEmail 的表。链接的表是VenueComment。如何访问VenueComment 中的项目?谢谢。

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore referenceproperty


    【解决方案1】:

    venues 实际上是一个query 对象。所以你需要获取或迭代它。

    尝试用循环替换 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 类型中。这样一来,您只需一次查询即可打印场地信息和用户电子邮件。

    【讨论】:

    • 感谢您的回答。考虑到您提到的性能问题,我决定将latestVenue 属性添加到User,现在我将其显示为result.latestVenue。但我也将它保存在Venue 下为ReferenceProperty 以供以后使用。我认为这更好。再次感谢您的帮助。
    猜你喜欢
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多