我的问题的简短版本:基于引用属性的查询过滤的Gql语法是什么?
我的问题的长版本: 假设以下模型:
Class User(db.Model):
username = db.StringProperty()
password = db.StringProperty()
Class Portfolios(db.Model):
portname = db.StringProperty()
Class Portfolio_Owners(db.Model):
port_id = db.ReferenceProperty(Portfolios)
user_id = db.ReferenceProperty(User)
key_string = db.StringProperty()
我想基于user_id(这是一个ReferenceProperty)查询Portfolio_Owners。
但是,我无法像在StringProperty上那样查询.user_id属性的字符串(以下内容返回一个空列表):
key_string = 'aglwb3J0Zm9saW9yCwsSBFVzZXIY6gEM'
que=db.GqlQuery("SELECT * FROM Portfolio_Owners WHERE user_id=:1", key_string)
entity = que.fetch(limit=10)
我也无法查询该用户的关键对象(以下内容也会返回一个空列表):
key_object = db.Key('aglwb3J0Zm9saW9yCwsSBFVzZXIY6gEM')
que=db.GqlQuery("SELECT * FROM Portfolio_Owners WHERE __key__=:1", key_object)
entity = que.fetch(limit=10)
是的,我确定user_id是正确的......这是数据存储区查看器的复制粘贴:
Entity Kind Portfolio_Owners
Entity Key aglwb3J0Zm9saW9yFwsSEFBvcnRmb2xpb19Pd25lcnMYhQIM
ID 261
user_id (Key) aglwb3J0Zm9saW9yCwsSBFVzZXIY6gEM
User: id=234
port_id (Key) aglwb3J0Zm9saW9yEQsSClBvcnRmb2xpb3MYhAIM
Portfolios: id=260
我还没有在App Engine文档,App Engine消息板或SO上的其他地方找到答案。
谢谢!
答案 0 :(得分:1)
所以aglwb3J0Zm9saW9yCwsSBFVzZXIY6gEM
是您的用户密钥,对吗?让我们从这开始:
user = db.Key('aglwb3J0Zm9saW9yCwsSBFVzZXIY6gEM')
que = db.GqlQuery("SELECT * FROM Portfolio_Owners WHERE user_id = :1", user)
这应该为您提供任何引用此用户的Portfolio_Owners实体。
您可以将其缩短为:
user = db.get('aglwb3J0Zm9saW9yCwsSBFVzZXIY6gEM')
que = user.Portfolio_Owners_set
数据存储区与SQL基本上完全不同。根据您的代码示例,我认为您将从重新访问文档中受益,以更好地了解数据存储区设计:
http://code.google.com/appengine/docs/python/datastore/entities.html