【问题标题】:Flask Sqlalchemy - query many to many with several valuesFlask Sqlalchemy - 使用多个值查询多对多
【发布时间】:2021-11-22 09:37:34
【问题描述】:

我在比赛和球队之间建立了多对多的关系,其中不止一支球队可以参加一场比赛,而且每支球队都可以参加多场比赛。这些模型是:

class Match(db.Model):
    __tablename__ = 'match'

    id = Column(
        db.Integer,
        primary_key=True,
        autoincrement=True)

    teams = db.relationship('Team', secondary='team_match_link')

class Team(db.Model):
    __tablename__ = 'team'

    id = Column(
        db.Integer,
        primary_key=True,
        autoincrement=True)

    matches = db.relationship('Match', secondary='team_match_link')


class TeamMatchLink(db.Model):

    __tablename__ = 'team_match_link'

    match_id = Column(
        db.Integer,
        db.ForeignKey('match.id'),
        primary_key=True
    )

    team_id = Column(
        db.Integer,
        db.ForeignKey('team.id'),
        primary_key=True
    )

给定两支球队[T1, T2],我如何查询只包含这两个球队而不包含其他球队的比赛?

这给了我至少包含两支球队的比赛,然后我当然可以检查这些比赛中是否还有其他球队。但它看起来很难看,我确定有更好/更有效的方法吗?理想情况下,该解决方案应该适用于 n 团队,而不会让我陷入循环地狱。

res1 = match.query.filter(match.team.any(id=T1.id)).all()
res2 = match.query.filter(match.team.any(id=T2.id)).all()
res = [i for i in res1 if i in res2]

【问题讨论】:

  • (缺少导入)
  • 真的应该有两支以上的队伍参加一场比赛吗?
  • @Detlef 是的,当然,这取决于一项运动。

标签: flask sqlalchemy many-to-many


【解决方案1】:

如何查询比赛球队链接并通过统计条目数进行汇总。

查询和一些解释如下:

your_teams = [T1.id, T2.id]
result = db.session.query(Match, TeamMatchLink).filter(TeamMatchLink.team_id.in_(your_teams)).group_by(TeamMatchLink.match_id).having(func.count(TeamMatchLink.team_id) == len(your_teams)).join(Match).all()

查询由几个部分和想法组成:

team_link_query = db.session.query(TeamMatchLink).filter(TeamMatchLink.team_id.in_(your_teams)))

这是选择所有包含所需团队的团队链接。

applicable_matches_query = team_link_query.group_by(TeamMatchLink.match_id).having(func.count(TeamMatchLink.team_id) == len(your_teams))

这会汇总团队匹配链接,以查找包含您需要的所有团队的链接。 (匹配将出现 nr 次,团队链接将匹配 your_teams 列表)

最后,加入将为您提供匹配项。您当然可以减少查询,直接从团队匹配链接表中为您提供匹配 ID。

【讨论】:

    猜你喜欢
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 2021-08-28
    相关资源
    最近更新 更多