2012-04-09 7 views
1

すべての親子を1対多の関係から取得しようとしています。伝統的に、私は結合でこれを行うことができましたが、データストアでそうすることは私を逃しています。GAEデータストアのreferenceProperty関係

これを行うにはいくつかの部分的な例がありますが、まだ完全な例はありません。

は私が持っている:あなたは「スコット」の前後に引用符を削除する場合

class Owner(db.Model): 
    name = db.StringProperty() 

class Pet(db.Model): 
    petname = db.StringProperty() 
    owner = db.ReferenceProperty(Owner, collection_name='pets') 

#now I want to print all pets owned by scott 
scott = Owner(name="scott") 
scott.put() 
Pet(owner=scott,petname="rufus").put() 

pets = Pet.all().filter('owner =', "scott").fetch(100) 
print Pet.all().filter('owner =', "scott").fetch(0) 

答えて

4

あなたのクエリが正常に動作する必要があり、私は思います。

またスコットのペットエンティティのすべての彼らの親として彼の実体を持たせることができます:

class Owner(db.Model): 
    name = db.StringProperty() 

class Pet(db.Model): 
    petname = db.StringProperty() 

scott = Owner(name="scott") 
scott.put() 

Pet(parent=scott, petname="rufus").put() 
Pet(parent=scott, petname="fluffy").put() 
Pet(parent=scott, petname="snoogums").put() 

pets = Pet.all().ancestor(scott).fetch(100) 
# Feed pets to your templating engine. So to speak. 

スコットペットエンティティの親にすることにより、それらはすべて同じエンティティグループに追加され、ancestorされていますクエリは、指定された `Owner 'の子であるPetエンティティすべてを取得するためのシンプルで堅実な方法を提供します。祖先クエリでは祖先以外のクエリよりもはるかに優れたパフォーマンスが得られるはずです。

これは、ペットエンティティが1つのエンティティグループにしか属していないという制限を課しています。Petに複数のデータ関係が含まれるようにするには、別の方法を選択する必要があります。それが1対1の関係であれば、他の関連エンティティへの参照を保存するだけです。

、あなたのPet実体の印刷可能な表現を持ってそれを__unicode__方法を与え、このような何かに:

class Pet(db.Model): 
    petname = db.StringProperty() 

    def __unicode__(self): 
     return "I am " + self.petname 

__unicode__はあなたがprint文が印刷された見たい情報を、文字列を返す必要があります。コメントでNickが賢明に指摘するように、App Engineアプリケーションではprintを使用しないでください。 SDKには、DjangoテンプレートとJinja2が付属しています。それらの1つを使用するか、好きなものをインポートしてください。

+0

私はと思います私が探しているものかもしれませんが、どうすればそれらを印刷できますか? 私はただ: プリントペット 私は: [<__ main__.Petオブジェクトを0x10859df50>、<__ main__.Petオブジェクトを0x1085904d0>、<__ main__。0x107bccb50>] –

+0

あなたの質問に答えた、@stubblejumper –

+0

'__repr__'はオブジェクトの 'コード'表現を返すことを意図しています。 '__unicode__'は人間が読める形式で使うためのメソッドですが、おそらくテンプレートシステムを使って現在の状況で気にするビットだけを出力するべきです。 App Engineアプリでは、実際には、本当に「プリント」を使用すべきではありません。 –

0

The GQL examples made by googleをご覧ください。

所有者をインスタンス化するときに、所有者名を「名前」ではなくkey_nameに 'scott'を与える​​一意のキーとして使用します。

scott = Owner(key_name="scott") 

pet = Pet(key_name='rufus', parent=scott) 

としてスコットとペットを作成し、所有者のキーでフィルタリングする必要があり

SELECT * FROM Pets WHERE ANCESTOR IS KEY('Owner', 'scott') 
0

と彼のペットを照会:

#not str "scott", use scott object. 
pets = Pet.all().filter('owner =', scott).fetch(100) 
関連する問題