GAE Python数据Moddeling /查询:引用实体的属性

时间:2013-02-05 11:00:05

标签: python google-app-engine google-cloud-datastore

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

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”会改变)

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

1 个答案:

答案 0 :(得分:0)

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