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
相关产品推荐
相关产品推荐

