首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Google App Engine中使用ReferenceProperty进行多对多过滤?

如何在Google App Engine中使用ReferenceProperty进行多对多过滤?
EN

Stack Overflow用户
提问于 2010-08-27 17:01:29
回答 1查看 240关注 0票数 1

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

代码语言:javascript
复制
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()

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

代码语言:javascript
复制
  players = player.all()

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

现在,我想这样做:

代码语言:javascript
复制
   if filter_by_club_name:
       players.filter(????)

我仍然从SQL的角度考虑,它应该是一个嵌套的子句:

代码语言:javascript
复制
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

但是这个样式丢弃了之前的过滤器,可能是球员的名字...

有人能帮我吗?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2010-08-28 01:07:36

GAE社区中的一个常见建议是将您的模型去规范化。这在这种特定情况下会很有用。

代码语言:javascript
复制
 class Player(db.Model): 
     name = db.StringProperty()  
     link = db.LinkProperty()
     club = db.ReferenceProperty(club)
     club_name = db.StringProperty()

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3582674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档