2010-09-07 51 views
0

我有一个具有自引用属性的实体,我想在自引用字段的键上使用WHERE条件进行搜索。我的目的是通过构建一个键列表来减少数据库命中,然后迭代同一个实体来构建一个嵌套列表。我使用这个列表为我想要返回的结果集的缓存字典版本创建memcache.get_multi()。这里是entitiy缩短版:带自引用属性键的GqlQuery

class Link(db.Model):  
    member = db.ReferenceProperty(Member)  
    url = db.TextProperty() 
    title = db.StringProperty() 
    category =db.SelfReferenceProperty() 

我已经建立了基于存储访问信息另一个实体的“类别”密钥词典。我想要做的是这样的:

for categoryKey in accessDict: 
    categoryDBKey = db.Key(categoryKey) 
    q = db.GqlQuery('SELECT __key__ FROM Link WHERE category.key() = :1',categoryDBKey) 

for qItem in q: 
    cacheList.append('Link_' + str(qItem)) 
    dataCache = memcache.get_multi(cacheList) 

但我得到“BadQueryError:分析错误:无效的WHERE条件”错误。

我知道我可以只通过全品类实体:

for categoryKey in accessDict: 
    category = db.ket(db.Key(categoryKey)) 
    q = db.GqlQuery('SELECT __key__ FROM Link WHERE category = :1',category) 

但它似乎是浪费的RPC如果我已经有我想要过滤的类别键值。

有没有一种方法来使用引用属性的键上的WHERE条件?

感谢

回答

2

参考属性存储钥匙,这样你就可以直接对它们进行比较:

for categoryKey in accessDict: 
    q = db.GqlQuery('SELECT __key__ FROM Link WHERE category = :1', db.Key(categoryKey)) 
+0

感谢德鲁,我必须想尽组合,但工作最简单的一种。 – user441842 2010-09-08 04:20:15