在GAE和python中查询具有特定父属性的实体?

时间:2012-10-07 22:24:32

标签: python google-app-engine

是否有可能以任何方式在GAE中使用其父级属性查询实体,如此(这不起作用)?

class Car(db.Model):
    title = db.StringProperty()
    type = db.StringProperty()

class Part(db.Model):
    title = db.StringProperty()

car = Car()
car.title = 'BMW X5'
car.type = 'SUV'
car.put()

part = Part(parent = car)
part.title = 'Left door'
part.put()

parts = Part.all()
parts.filter('parent.type ==', 'SUV') # this in particular

我读过 ReferenceProperty 索引,但我不确定我需要什么。

GAE允许我将父级设置为 Part 实体,但我是否需要实际(重复种类):

parent = db.ReferenceProperty(Car, required=True)

由于它有父母,所以感觉就像复制了系统所做的那样。或者还有其他方式吗?

3 个答案:

答案 0 :(得分:2)

这不是你问题的答案,但是NDB提供了结构化的属性。

https://developers.google.com/appengine/docs/python/ndb/properties#structured

  

您可以构建模型的属性。例如,您可以定义一个模型类Contact,其中包含一个地址列表,每个地址都有内部结构。

虽然使用与模型类相同的语法定义结构化属性实例,但它们不是完整的实体。他们在数据存储区中没有自己的密钥。它们无法独立于它们所属的实体进行检索。但是,应用程序可以查询其各个字段的值。

所以这里的汽车将零件作为结构化财产。如果在您的用例中这是可行的,取决于您如何构建数据。如果你想知道哪些部件组成一辆特定的汽车,那似乎是可行的。如果您想要归档全球零件而不管它们属于哪种汽车,那么您仍然可以这样做,但您必须使每辆车内的“零件”也引用不同的型号。如果你看到我的意思(我不确定我这样做),因为每辆车都包含它自己的部件。

答案 1 :(得分:1)

将父项添加为显式属性不会有帮助。

你可以将它分为两​​部分:

for suv in Car.all().filter('type', 'SUV'):
  for part in Part.all(ancestor=suv):
    ...do something with part...

答案 2 :(得分:0)

如果要查询另一个(父)对象的属性,则必须先获取该对象。

我可以想到两个问题的解决方案:

Guido的方法是查询父级,然后查询该部分。这种方式可以发出更多查询。

第二种方法是在Part中存储parent.type的副本。缺点是您存储的是重复数据(更多存储空间),您必须注意Part中的数据和Car中的数据是否匹配。但是,您只需要发出一个查询。

你必须找出哪一个更适合你。