2008-11-29 60 views
0

我的情况,我需要跨越像in the Django database model查询谷歌App Engine的实体关系是。我使用ListProperty S代表一个一对多的关系,就像这样:GQL查询,以有效地跨越实体关系

class Foo(db.Model): bars = db.ListProperty(db.Key) 
class Bar(db.Model): eggs = db.ListProperty(db.Key) 

而且我想执行一个查询,执行以下操作:

# Foo.filter('bars.eggs =', target_egg) 
[foo 
for egg in eggs if egg == target_egg 
for eggs in bar.eggs 
for bar in foo.bars 
for foo in Foo.all()] 

的理解似乎根本低效。我真的很想执行查询作为注释部分,但它并不像the GQL syntax允许对属性的属性查询:

SELECT * FROM <kind> 
    [WHERE <condition> [AND <condition> ...]] 
    [ORDER BY <property> [ASC | DESC] [, <property> [ASC | DESC] ...]] 
    [LIMIT [<offset>,]<count>] 
    [OFFSET <offset>] 

    <condition> := <property> {< | <= | > | >= | = | != } <value> 
    <condition> := <property> IN <list> 
    <condition> := ANCESTOR IS <entity or key> 

回答

3

你是对的,App Engine数据存储没有按不允许这种查询。你说得对,列表理解是无效的。不过考虑一下,当你用像你这样的连接执行一个查询时,这与关系数据库几乎完全相同 - 数据库必须执行与你在这里执行相同的O(n^3)工作 - 唯一的区别是你是用Python做的,还有额外的往返时间。由于App Engine旨在进行扩展,因此它不是真正用于这类查询。

通常情况下,您可以通过移动您需要访问的某些属性到Foo模型,或者如果您正在执行聚合,通过将总数移动到Foo模型。但是,如果没有更多关于你想要解决什么问题的想法,就很难给出具体的解决方案。