【问题标题】:How to extract data from two GQL classes?如何从两个 GQL 类中提取数据?
【发布时间】:2011-04-27 14:01:50
【问题描述】:

我有以下两个课程:

class UsersRSS(db.Model):
    userId = db.IntegerProperty()
    fileHash = db.StringProperty()
    added = db.DateTimeProperty(auto_now_add=True)

class Files(db.Model):
    fileHash = db.StringProperty()
    title = db.StringProperty()
    file = db.BlobProperty()
    added = db.DateTimeProperty(auto_now_add=True)    

我需要创建一个 GQL 查询,它将从两个表中返回一个数据:

items = UsersRSS.gql("WHERE userId = :userId ORDER BY date DESC LIMIT 10", userId=user_id)

但是每个item 除了fileHashadded 字段外,都应该包含来自第二类的字段-titlefile(匹配应该由fileHash 字段完成)。

【问题讨论】:

    标签: sql database google-app-engine gql gqlquery


    【解决方案1】:

    无法使用相同的GQL Select 语句从数据存储区中检索不同的种类。

    另一种选择是使用ReferencePropertyUsersRSSFiles 之间创建多对一关系,以这种方式重构您的代码:

    class UsersRSS(db.Model):
        userId = db.IntegerProperty()
        file = db.ReferenceProperty(Files)
        added = db.DateTimeProperty(auto_now_add=True)
    
    class Files(db.Model):
        fileHash = db.StringProperty()
        title = db.StringProperty()
        file = db.BlobProperty()
        added = db.DateTimeProperty(auto_now_add=True)
    
    items = UsersRSS.gql("WHERE userId = :userId ORDER BY date DESC LIMIT 10", userId=user_id)
    

    这样,Files 属性将使用item.file.title 点符号自动取消引用:

    for item in items:
        print item.UserID
        print item.Added
        print item.file.title #This costs an additional RPC call to Datastore
    

    要从 ReferenceProperty RPC 开销中节省您的应用程序,请查看常青文章 ReferenceProperty prefetching

    【讨论】:

    • 谢谢!如何使用这种方法将file 添加到UsersRSSfile = Files(key_name="z"+self.request.get('hash')); file.put(); fileRecord = UsersRSS(); fileRecord.file = file; fileRecord.put() 是正确的方法吗?
    • 没错,你可能忘了在fileRecord.put()之前设置userIdfileRecord
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多