我在一个情况下,我需要跨越喜欢的在Django的数据库模型。我使用ListPropertys一个一对多的关系,就像这样:

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模型有点推动这项工作,通过移动一些你需要访问到富模式,或者如果你正在做的集合体,由总移动到富的属性的方式模型。这是很难给出具体的解决方案,而更多的你想解决什么问题的想法,虽然。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top