这是我的模型,球员和俱乐部。由于一个俱乐部可以有多个球员,一个球员可以有多个俱乐部(在其载体中),我使用了一个多对多的关系:
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
但是这个样式丢弃了之前的过滤器,可能是球员的名字...
有人能帮我吗?谢谢。
发布于 2010-08-28 01:07:36
GAE社区中的一个常见建议是将您的模型去规范化。这在这种特定情况下会很有用。
class Player(db.Model):
name = db.StringProperty()
link = db.LinkProperty()
club = db.ReferenceProperty(club)
club_name = db.StringProperty()这将允许您轻松地根据俱乐部名称过滤球员。
显然,这使得更改俱乐部名称变得更加困难。但不得不更改俱乐部名称的可能性很低。
https://stackoverflow.com/questions/3582674
复制相似问题