2

我有以下两个课程:

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字段完成)。

4

1 回答 1

4

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

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

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

于 2011-04-27T14:43:57.953 回答