1

我有一个与此类似的场景,我正在尝试找到最佳/最常见的解决方案:

class Car(db.Model):
  peopleCapacity = db.IntegerProperty()

class Wheel(db.Model):
  car = db.ReferenceProperty(reference_class=Car, collection_name='wheels')
  diameter = db.IntegerProperty()  

我想要这种查询的结果:

smallWheelsForBigCars = db.GqlQuery(
  'SELECT * FROM Wheel WHERE diameter < 10 AND car.peopleCapacity > 6'        
)
# returns 0 entities as properties like 'car.peopleCapacity' are apparently not supported

我考虑过的一些(hacky)解决方案:

  • 分别对 Wheel 和 Car 进行约束并手动检查交叉口(慢!)
  • 使用 computedProperty 将 car.peopleCapacity 的副本存储在 Wheel 中。(不好,因为当汽车的 peopleCapacity 发生变化时,我需要更新连接到汽车的所有车轮。是的,在我的实际情况下,“peopleCapacity”会改变)

我的两个问题是:
为什么 car.peopleCapacity 在查询中不起作用?
有没有更好的方法来解决这个问题?

4

1 回答 1

0

您的结论是正确的,数据存储区没有子属性查询能力(您可以使用 StructureProperty 实现这一点,但不是您正在寻找的方式)。
您应该对模型进行非规范化并将所有内容放在大实体上,更新会很痛苦,但检索结果会更容易和更快。

于 2013-02-05T11:32:32.577 回答