对ReferenceProperty()的Gql查询

0 投票
1 回答
1429 浏览
提问于 2025-04-16 16:50

我问题的简短版本: 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。

但是,我不能像查询字符串属性那样直接查询.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讨论区或其他地方都没有找到答案。

谢谢!

1 个回答

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

撰写回答