如何查询关系表数据并输出包含订阅用户列表的Coach结构JSON结果
解决方案
1. 前置检查:确认多对多中间表定义
你的代码中关系配置用到了secondary=subs,需要先确保多对多中间表已提前定义,若未定义请在两个模型声明前添加以下代码:
subs = db.Table( 'subs', db.Column('user_id', db.BigInteger, db.ForeignKey('user.user_id'), primary_key=True), db.Column('coach_id', db.BigInteger, db.ForeignKey('coach.coach_id'), primary_key=True) )
2. 具体查询与序列化代码
你已经通过backref='subscribers'给Coach模型绑定了订阅用户关联属性,直接查询所有Coach后手动构造符合要求的输出结构即可,同时我们使用预加载优化避免N+1查询问题:
from flask import jsonify def get_all_coaches_with_subscribers(): # 预加载关联的订阅用户数据,提升查询性能 coaches = Coach.query.options(db.joinedload(Coach.subscribers)).all() resp_data = [] for coach in coaches: # 构造教练字段 coach_item = { "coach_id": coach.coach_id, "coach_login": coach.login, "subscribers": [] } # 构造订阅用户列表 for subscriber in coach.subscribers: coach_item["subscribers"].append({ "user_id": subscriber.user_id, "user_login": subscriber.login }) resp_data.append(coach_item) # Flask环境下直接返回jsonify,普通Python环境可使用json.dumps(resp_data) return jsonify(resp_data)
输出说明
返回的JSON结构完全符合你的预期,单条数据示例如下:
{"coach_id":1,"coach_login":"Alan","subscribers":[{"user_id":1,"user_login":"John"}]}
内容的提问来源于stack exchange,提问作者sneaky2
相关产品推荐
相关产品推荐

