1

这是我的模型,球员和俱乐部。由于一个俱乐部可以有很多球员,而一个球员可以有很多俱乐部(在其 carrer 中),我使用了多对多关系:

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()

现在,我有一个搜索界面,可以搜索所有球员,并添加零个或多个限制,例如球员姓名和他效力的俱乐部。因此,我有一个级联类型的处理:

  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 社区中的一个常见建议是对模型进行非规范化。这在这种特定情况下很有用。除了俱乐部的引用属性之外,您还可以将俱乐部名称作为字符串存储在每个球员实体中:

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

这将允许您轻松地按俱乐部名称过滤球员。

显然,这使得更改俱乐部名称变得更加困难。但是不得不更改俱乐部名称的可能性很低。

于 2010-08-27T17:07:36.487 回答