我处于需要在in the Django database model之类的查询中跨越Google App Engine实体关系的情况。我将ListProperty
用于一对多关系,如下所示:
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>
答案 0 :(得分:3)
您说得对,App Engine数据存储区不允许此类查询。你是对的,列表理解是低效的。但是,请考虑一下,当您使用类似的连接执行查询时,这几乎就是关系数据库所执行的操作 - 数据库必须执行您在此处执行的相同O(n ^ 3)工作 - 唯一的区别是你是用Python做的,还有额外的往返时间。由于App Engine是为扩展而设计的,因此并不是真的可以用于这类查询。
通常情况下,有一种方法可以通过将一些需要访问的属性移动到Foo模型上,或者如果你正在进行聚合,通过将总数移到Foo上来对模型进行非规范化以促进这一点。模型。但是,如果没有更多地了解你试图解决的问题,很难给出具体的解决方案。