如何从两个GQL类中提取数据?

时间:2011-04-27 14:01:50

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

我有以下两个班级:

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)

但除itemfileHash字段外,每个added都应包含第二个类的字段 - titlefile(匹配应由{ {1}}字段)。

1 个答案:

答案 0 :(得分:4)

使用相同的 GQL Select语句无法从Datastore检索不同的种类。

另一种选择是使用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