SQLAlchemy查询项目成员时去重并关联对应团队的问题
解决SQLAlchemy查询中members列表关联错误及重复问题
当前查询项目时,
teams字段能正确获取,但members列表返回数据库所有成员且存在重复,需要让members仅包含该项目对应团队的成员,并去除重复数据。
问题原因
members的子查询未添加与当前项目的关联条件,导致拉取了TeamMemberLinkModel中的全部数据- 聚合函数
array_agg未做去重处理,导致同一成员因多关联关系重复出现
解决方案
修改members字段的子查询,添加项目与团队的关联逻辑,并通过DISTINCT去除重复数据:
teamIds = db.session.query(TeamMemberLinkModel.teamId).filter(TeamMemberLinkModel.memberId == memberId) projectQuery = db.session.query( ProjectModel.name, ProjectModel.isActive, select(func.array_agg( func.json_build_object( 'teamId', ProjectTeamLinkModel.teamId, 'teamName', ProjectTeamLinkModel.teamName, 'colorCode', ProjectTeamLinkModel.colorCode ) )).where( ProjectTeamLinkModel.teamId.in_(teamIds), ProjectTeamLinkModel.projectId == ProjectModel.id ).label('teams'), ProjectModel.id, ProjectModel.clientId, # 修改后的members子查询 select(func.array_agg( func.distinct(func.json_build_object( 'memberName', TeamMemberLinkModel.memberName, 'memberId', TeamMemberLinkModel.memberId, 'roleId', TeamMemberLinkModel.roleId, 'roleName', TeamMemberLinkModel.roleName )) )).where( # 关联当前项目对应的所有团队ID TeamMemberLinkModel.teamId.in_( select(ProjectTeamLinkModel.teamId).where(ProjectTeamLinkModel.projectId == ProjectModel.id) ) ).label('members'), ProjectModel.isDeleted, func.json_build_object( 'id', ProjectModel.clientId, 'name', ProjectModel.clientName ).label('client') ).filter( ProjectModel.id.in_(unionQuery), ProjectModel.isDeleted.is_(False) )
关键修改说明
- 关联项目团队:通过嵌套子查询获取当前项目绑定的所有团队ID,限定
TeamMemberLinkModel仅查询这些团队下的成员,确保数据关联性正确 - 去除重复数据:在
array_agg内部使用func.distinct(),对生成的成员JSON对象进行去重,避免同一成员因多角色/多团队关联导致的重复
内容的提问来源于stack exchange,提问作者HyperOni
相关产品推荐
相关产品推荐

