1

これは私のモデル、プレイヤーとクラブです。クラブは多くのプレーヤーを持つことができ、プレーヤーは(そのキャリア内で)多くのクラブを持つことができるので、私は多対多の関係を使用しました:

class Club(db.Model): 
   name = db.StringProperty()  
   link = db.StringProperty()  

 class Player(db.Model): 
   name = db.StringProperty()  
   link = db.LinkProperty()  

 class ClubHasPlayer(db.Model): 
   club = db.ReferenceProperty(Club, required=True,
      collection_name='club_players')
   player = db.ReferenceProperty(Player, required=True,
      collection_name='player_clubs')
   number = IntegerProperty()

これで、すべてのプレーヤーを検索し、プレーヤー名や彼がプレーしたクラブなど、0個以上の制限を追加できる検索インターフェイスができました。したがって、これを処理するカスケードタイプがあります。

  players = player.all()

   if filter_by_player_name:
       players.filter("name =",filter_by_player_name)

今、私はこれをしたい:

   if filter_by_club_name:
       players.filter(????)

私はまだSQLの観点から考えています、そしてそれはネストされた節のようなものでなければなりません:

select * from player where player.name='x' and player.id in (select club_has_player.player_id from club_has_player, club where club_has_player.club_id = club.id and club_name = "Y")

どうやってするの?

私はクラブから行くことができることを知っています、つまり:

club = Club.filter( "name ="、filter_by_club_name).get()club.club_players

ただし、このスタイルでは、プレーヤー名である可能性のある前のフィルターが破棄されます。

誰かがここで私を助けることができますか?ありがとう。

4

1 に答える 1

1

GAE コミュニティでよくあるアドバイスの 1 つは、モデルを非正規化することです。これは、この特定の状況で役立ちます。クラブへの参照プロパティに加えて、すべてのプレーヤー エンティティにクラブ名を文字列として格納できます。

 class Player(db.Model): 
     name = db.StringProperty()  
     link = db.LinkProperty()
     club = db.ReferenceProperty(club)
     club_name = db.StringProperty()

これにより、プレーヤーをクラブ名で簡単にフィルタリングできます。

明らかに、これによりクラブ名の変更が難しくなります。しかし、クラブ名を変更しなければならない可能性は低いです。

于 2010-08-27T17:07:36.487 に答える