2011-05-02 34 views
0

我的问题的简短版本:基于引用属性的查询过滤的Gql语法是什么?ReferenceProperty上的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 Portfolio_Owners(这是一个的ReferenceProperty)。

key_string = 'aglwb3J0Zm9saW9yCwsSBFVzZXIY6gEM' 

que=db.GqlQuery("SELECT * FROM Portfolio_Owners WHERE user_id=:1", key_string) 

entity = que.fetch(limit=10) 

我也不能的一个关键目标上查询:

但是,我不能在.user_id财产的字符串,你会在StringProperty(以下返回一个空列表)查询用户(以下也返回一个空列表):

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上的其他地方找到答案。

谢谢!

回答

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

+0

感谢。本来可以发誓我也试过这个,但我显然有一个错字或相当愚蠢的语法错误。再次感谢。 – 2011-05-02 18:01:08

+0

@Jeff在你的问题的例子中,你正在倒退 - 你试图用该键检索记录,而不是在其引用属性中包含该键的记录。 – 2011-05-02 21:32:34

+0

谢谢,尼克。我只提出了一些我尝试过的许多失败的查询。 ;)将user_id过滤为一个属性似乎更合乎逻辑,但我无法得到它的工作,所以我认为Datastore可能只会将user_id识别为关键对象。 – 2011-05-03 01:48:45