题
我在一个情况下,我需要跨越喜欢的在Django的数据库模型。我使用ListProperty
s一个一对多的关系,就像这样:
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()]
在理解似乎根本低效的。我真的很想执行查询作为注释部分,但它看起来并不像的所述GQL语法允许对属性的属性查询:
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>
解决方案
您说的没错,在App Engine数据存储不允许这种查询。你说得对,名单理解是低效的。想想,虽然,这是相当多,当你执行一个查询与联接喜欢你的一个关系数据库不正是 - 数据库必须执行同样的为O(n ^ 3)工作,你在这里所做的 - 唯一不同的是你正在做它在Python中,并用额外的往返时间。由于App Engine是设计规模,这不是真的为这些类型的查询制成。
通常,虽然,有可以denormalise模型有点推动这项工作,通过移动一些你需要访问到富模式,或者如果你正在做的集合体,由总移动到富的属性的方式模型。这是很难给出具体的解决方案,而更多的你想解决什么问题的想法,虽然。
不隶属于 StackOverflow