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

私が検討したいくつかの(ハッキーな)ソリューション:

  • WheelとCarのコンストレイントを個別に実行し、交差点を手動でチェックします(遅い!)
  • calculatedPropertyを使用して、car.peopleCapacityのコピーをWheelに保存します。(悪いです。車のpeopleCapacityが変更されたときに、車に接続されているすべてのホイールを更新する必要があるためです。実際の場合、「peopleCapacity」も変更されます)

私の2つの質問は次のとおりです。car.peopleCapacityが
クエリで機能しないのはなぜですか。
これに対するより良いアプローチはありますか?

4

1 に答える 1

0

結論は正しいです。データストアにはサブプロパティクエリ機能がありません(StructurePropertyを使用してそれを実現できますが、探している方法では実現できません)。
モデルを非正規化し、すべてを大きなエンティティに配置する必要があります。更新するのは面倒ですが、結果を取得するのがより簡単かつ迅速になります。

于 2013-02-05T11:32:32.577 に答える