0

我的情况是,我需要在 Django 数据库模型中的查询中跨越 Google App Engine 实体关系。我将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>
4

1 回答 1

3

你是对的,App Engine 数据存储不允许这种查询。你说得对,列表理解效率低下。但是,请考虑一下,当您使用像您的连接一样执行查询时,这几乎正是关系数据库所做的 - 数据库必须执行与您在这里所做的相同的 O(n^3) 工作 - 唯一的区别是你是用 Python 做的,而且还有额外的往返时间。由于 App Engine 是为扩展而设计的,因此它并不是真正为这类查询而设计的。

但是,通常有一种方法可以使您的模型去规范化以促进这一点,方法是将您需要访问的一些属性移到 Foo 模型上,或者如果您正在进行聚合,则将总数移到 Foo 模型上。但是,如果不进一步了解您要解决的问题,就很难给出具体的解决方案。

于 2008-11-29T17:56:24.750 回答