1

私はすべての親子を1対多の関係にしようとしています。従来は、結合を使用してこれを行うことができましたが、データストアでこれを行うことは私を逃れています。

私はこれを行うためのいくつかの部分的な例を見つけましたが、まだ完全なものではありません。

私は持っています:

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

3 に答える 3

4

「scott」を囲む引用符を削除すると、クエリは正常に機能するはずです。

また、Scott の Pet エンティティのすべてに、彼のエンティティを親として持たせることもできます。

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.

scott を Pet エンティティの親にすることで、それらはすべて同じエンティティ グループに追加され、クエリは、指定された「所有者」の子であるancestorすべてのエンティティを取得するための単純で簡単な方法を提供します。Pet祖先クエリを使用すると、非祖先クエリよりもはるかに優れたパフォーマンスが得られるはずです。

これは、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 がコメントで賢明に指摘しているようprintに、AppEngine アプリケーションでは使用しないでください。SDK には Django テンプレートと Jinja2 が付属しています。それらのいずれかを使用するか、好みのものをインポートします。

于 2012-04-09T15:32:29.523 に答える
0

google が作成した GQL の例 を見てください。

所有者をインスタンス化するときに、'name' の代わりに 'scott' を key_name に与える一意のキーとして所有者名を使用します。

scott = Owner(key_name="scott")

scott を親としてペットを作成します

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

そして、彼のペットにクエリを実行します

SELECT * FROM Pets WHERE ANCESTOR IS KEY('Owner', 'scott')
于 2012-04-09T15:36:33.777 に答える
0

所有者のキーでフィルタリングする必要があります。

#not str "scott", use scott object.
pets = Pet.all().filter('owner =', scott).fetch(100)
于 2012-04-10T03:32:25.963 に答える