2

このように、GAE で親のプロパティの 1 つを使用してエンティティをクエリすることは、何らかの方法で可能ですか (これは機能しません)。

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を定義できます。

構造化プロパティインスタンスは、モデルクラスの場合と同じ構文を使用して定義されますが、本格的なエンティティではありません。データストアには独自のキーがありません。それらが属するエンティティから独立して取得することはできません。ただし、アプリケーションは個々のフィールドの値を照会できます。

したがって、ここで車には構造化されたプロパティとしてパーツが含まれます。これがユースケースで実行可能かどうかは、データの構造に依存します。特定の車を構成する部品を知りたい場合は、それは実行可能と思われます。所属する車に関係なくグローバルパーツをファイリングしたい場合でも、それは可能ですが、各車内の「パーツ」も異なるモデルを参照するようにする必要があります。それぞれの車には独自の部品が含まれているので、私が何を意味するのか(私にはわかりませんが)わかります。

于 2012-10-08T09:05:54.560 に答える
1

別の(親)オブジェクトのプロパティを照会する場合は、最初にそのオブジェクトを取得する必要があります。

私はあなたの問題に対する2つの解決策を考えることができます:

Guidoの方法は、親を照会してから、パーツを照会することです。このようにして、より多くのクエリを発行します。

2番目の方法は、partの中にparent.typeのコピーを保存することです。欠点は、重複データ(より多くのストレージ)を保存していることです。PartのデータとCarのデータが一致するように注意する必要があります。ただし、発行する必要があるクエリは1つだけです。

どちらが自分に適しているかを理解する必要があります。

于 2012-10-08T04:36:11.167 に答える
1

親を明示的なプロパティとして追加しても効果はありません。

ただし、次の2つの部分に分割できます。

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 に答える