5

Google App Engineを使用していますが、ReferencePropertiesをフィルタリングするためのクエリの記述に問題があります。

例えば。

class Group(db.Model):
    name = db.StringProperty(required=True)
    creator = db.ReferenceProperty(User)

class GroupMember(db.Model):
    group = db.ReferenceProperty(Group)
    user = db.ReferenceProperty(User)

そして、私はこのようなものを書いてみました:

members = models.GroupMember.all().filter('group.name =', group_name)

と機能しない他のさまざまなもの。うまくいけば、誰かが私に正しい方向に製品を与えることができます...

4

5 に答える 5

5

グループに一意の名前が付けられている場合、「group.name」はグループ エンティティの一意の識別子です。

つまり、次のように記述できます。

  members = models.GroupMember.all().filter(
    "group =",model.Group.gql("WHERE name=:1", group_name).get()
    )

ただし、グループエンティティがスタックのどこかに横たわっていない場合にのみ、これを行う必要があります。

appengine を使用した多対多に関する Google のエッセイはこちらです。

于 2009-02-08T20:04:38.940 に答える
1

これには結合が必要ですが、これは App Engine では不可能です。別のモデルのプロパティでフィルター処理する場合は、クエリ対象のモデルにそのプロパティを含める必要があります。

于 2009-01-15T22:21:23.200 に答える
1

これにより、2 つのデータストア ヒットが発生しますが、機能するはずです。memcache を使用する場合は問題になりません。

group = models.Group.all().filter("name =", group_name).get()
members = models.GroupMember.all().filter('group =', group)   
于 2009-01-23T03:35:41.943 に答える
0

質問で定義したモデルを使用して、「スペースモンキー」というグループのすべてのメンバーを一覧表示するとします。

mygroup = Group.gql("WHERE name = :1",'Space monkeys')

for group_member in mygroup.groupmember_set:
    print 'group members name is: %s' % (group_member.user.name)

groupmember_set」は「暗黙のコレクションプロパティ」と呼ばれ、非常に便利です。collection_nameキーワードパラメータを使用してデフォルト名を上書きすることで、好きなように呼び出すことができますReferenceProperty。例については、ThomasLHoladayによる回答を参照してください。

これはすべて、Rafe Kaplaによる非常に優れた論文で説明されています:実体関連のモデリング

于 2010-01-25T18:11:30.317 に答える