You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask-SQLAlchemy多对多查询如何合并关联表的所有匹配结果

解决方案

方案1:直接使用已定义的ORM关系(推荐)

你已经在模型中定义了多对多关联的relationship,Films实例会自动带有gen_films属性,存储了当前电影关联的所有Genres对象,不需要手动写join查询,代码更简洁:

# 直接查询Films列表,自带关联的分类数据,无N+1查询问题(因为你配置了backref的lazy=joined)
all_films = Films.query.paginate()

# 序列化时直接取对应字段即可,示例结构:
for film in all_films.items:
    res = {
        "film_id": film.film_id,
        "film_name": film.film_name,
        "genres": [g.genre_name for g in film.gen_films]
    }

这种方式天然适配flask_restx的序列化规则,你只需要在返回的marshal结构中把genres定义为fields.List(fields.String)类型即可。

方案2:使用SQL聚合函数在查询层合并分类

如果你希望在SQL查询阶段就直接得到合并后的分类结果,可以使用SQL的分组聚合功能,根据你使用的数据库选择对应的聚合函数:

  • MySQL/SQLite 使用 group_concat
  • PostgreSQL 使用 string_agg

示例代码(以MySQL/SQLite为例):

from sqlalchemy import func

all_films = db.session.query(
    Films,
    Films.film_name,
    func.group_concat(Genres.genre_name).label("genres")
).join(films_genres).join(Genres)\
.group_by(Films.film_id, Films.film_name)\
.paginate()

# 得到的genres是逗号分隔的字符串,拆分后即可得到列表
for item in all_films.items:
    film, film_name, genres_str = item
    genres = genres_str.split(",")

内容的提问来源于stack exchange,提问作者Dima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:54:10