2016-02-29 86 views
0

我有两个以一对多关系加入的类(团队与团队中的玩家)。在SQLAlchemy中对联合实体进行过滤和排序

我想查询某个特定团队的所有玩家的特定位置,并以最后的名字排序。

我的查询看起来到目前为止是这样的:

query = db.session.query(Team).join(Player) \ 
    .filter(Team.team_id = team) \ #team is passed in to the function 
    .filter(Player.position.in_(['QB', 'RB', 'WR', 'TE'])) \ 
    .order_by(Player.last_name).order_by(Player.first_name).first() 

的SQL据此产生当然除了它缺少的球员表的映射字段

SELECT team.team_id AS team_team_id, team.name AS team_name, team.city AS team_city, team.state AS team_state, team."stadiumName" AS "team_stadiumName" 
FROM team JOIN player ON team.team_id = player.team 
WHERE team.team_id = :team_id_1 AND player.position IN (:position_1, :position_2, :position_3, :position_4) ORDER BY player.last_name, player.first_name 

如果我使用的查询(队球员)我得到元组。现在,它忽略了Player对象上的过滤器和orderby子句。我确定这是我错过的小事。

每建议,下面我试图做一个元组查询:

teams, players = db.session.query(Team, Player) \ 
    .filter(Team.team_id == team) \ 
    .filter(Player.position.in_(['QB', 'RB', 'WR', 'TE'])) \ 
    .order_by(Player.last_name).order_by(Player.first_name) 

这导致

ValueError: too many values to unpack (expected 2)

+0

你的意思是它忽略了你的过滤器和ORDER_BY?他们在SQL中。你只是想要一个'Player'对象列表吗? – univerio

+0

是的。查询对象是与我的查询匹配的一个团队对象。当我打电话给query.Players时,它是队伍名单中所有球员的完整列表,而不是与筛选器/排序匹配的已排序,已过滤的球员列表。 –

回答

1

最简单的方法来执行一个往返的结果是把两个实体的查询:

query = db.session.query(Team, Player).join(Player) \ 
    .filter(Team.team_id == team) \ 
    .filter(Player.position.in_(['QB', 'RB', 'WR', 'TE'])) \ 
    .order_by(Player.last_name).order_by(Player.first_name) 

这将返回一个Team,Player元组列表,它应该与您的查询。

要到达顶级球队

team, p = query.first() 

而获得玩家使用列表理解上查询像这样

players=[player for _, player in query] 
+0

但我想要团队以及单个顶级对象。 同样,当用户点击到列表中的单个玩家时,我想要为玩家加入其统计信息的另一个查询。 –

+0

@MichaelBrown如果你想要两个为什么'query(Team,Player)'没有问题?你需要做一些按摩,把它变成一个'Team'和一个'Players'列表,而不是一个元组列表,但这是根据你的需求去做的最好方法。 – univerio

+0

我想我只是困惑如何工作。这个元组包含每个玩家重复一次,然后是玩家列表中的玩家列表? –

相关问题