我有以下两个班级:
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
和fileHash
字段外,每个added
都应包含第二个类的字段 - title
和file
(匹配应由{ {1}}字段)。
答案 0 :(得分:4)
使用相同的 GQL Select语句无法从Datastore检索不同的种类。
另一种选择是使用ReferenceProperty在UsersRSS
和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。