2

是否有可能以任何方式使用其在 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

我已经阅读了ReferencePropertyIndexes ,但我不确定我需要什么。

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

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

这感觉就像复制系统已经做的事情,因为它有一个父母。还是有其他方法?

4

3 回答 3

2

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

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

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

尽管结构化属性实例是使用与模型类相同的语法定义的,但它们并不是成熟的实体。他们在 Datastore 中没有自己的密钥。它们不能独立于它们所属的实体来检索。但是,应用程序可以查询其各个字段的值。

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

于 2012-10-08T09:05:54.560 回答
1

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

你可以把它分成两部分:

for suv in Car.all().filter('type', 'SUV'):
  for part in Part.all(ancestor=suv):
    ...do something with part...
于 2012-10-07T23:50:39.910 回答
1

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

对于您的问题,我可以想到两种解决方案:

Guido 的方式是先查询父节点,然后再查询部分。这种方式发出更多的查询。

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

你必须弄清楚哪一个更适合你。

于 2012-10-08T04:36:11.167 回答