如何将Flask-SQLAlchemy多表查询结果(含列名与值)存入列表以用于jsonify
如何将Flask-SQLAlchemy多表查询结果(含列名与值)存入列表以用于jsonify
嗨,看起来你已经把外连接的查询逻辑搞对了,现在就差把多表结果转成能用来返回JSON的格式对吧?我来给你一步步讲清楚怎么处理~
首先得注意:你现在用db.session.query(Department, Supplier)查出来的结果,每一条都是**(Department对象, Supplier对象)**的元组,而不是单个模型对象,这和你单表查询返回的结果不一样,所以不能直接套用单表的写法。
第一步:先修正你的查询语句(小细节)
你原来的outerjoin参数顺序有点问题,左外连接应该是从主表(Department)连接到关联表(Supplier),所以正确的写法应该是:
# 获取单个部门的结果用first(),如果要多个就用all() dept_supplier_pair = db.session.query(Department, Supplier) \ .outerjoin(Supplier, Department.default_supplier_id == Supplier.id) \ .filter(Department.id == id) \ .first()
第二步:拆分元组并合并字段
拿到这个元组后,我们可以把Department和Supplier的字段分别转成字典,再合并到一起(记得处理Supplier为None的情况,因为是外连接,有些部门可能没有供应商)。如果要存入列表,就把每个合并后的字典放进列表里就行。
完整代码示例:
@department.route("/department/getDepartmentDetails/<int:id>", methods=['GET', 'POST']) def getDepartmentDetails(id): # 修正后的查询 dept_supplier_pair = db.session.query(Department, Supplier) \ .outerjoin(Supplier, Department.default_supplier_id == Supplier.id) \ .filter(Department.id == id) \ .first() result_list = [] if dept_supplier_pair: dept_obj, supplier_obj = dept_supplier_pair # 提取部门的所有字段,和你单表的写法一样 dept_data = {c.name: str(getattr(dept_obj, c.name)) for c in dept_obj.__table__.columns} # 如果有供应商,提取它的字段,建议加前缀避免字段重名(比如两个表都有id) if supplier_obj: supplier_data = {f"supplier_{c.name}": str(getattr(supplier_obj, c.name)) for c in supplier_obj.__table__.columns} dept_data.update(supplier_data) # 把合并后的字典加入列表 result_list.append(dept_data) # 返回JSON格式的列表 return jsonify(result_list)
如果是查询多个部门的情况
如果你的需求是查询多个部门(去掉filter或者改filter条件),就用all()获取所有结果,然后循环处理每个元组:
dept_supplier_pairs = db.session.query(Department, Supplier) \ .outerjoin(Supplier, Department.default_supplier_id == Supplier.id) \ .all() result_list = [] for dept_obj, supplier_obj in dept_supplier_pairs: dept_data = {c.name: str(getattr(dept_obj, c.name)) for c in dept_obj.__table__.columns} if supplier_obj: supplier_data = {f"supplier_{c.name}": str(getattr(supplier_obj, c.name)) for c in supplier_obj.__table__.columns} dept_data.update(supplier_data) result_list.append(dept_data) return jsonify(result_list)
小提示
- 为什么要加
supplier_前缀?因为如果Department和Supplier有同名字段(比如id),直接合并会覆盖掉部门的字段值,加前缀能避免这个问题。 - 如果不需要字符串类型,可以去掉
str(),根据你的业务需求调整。
备注:内容来源于stack exchange,提问作者Michael Valan
相关产品推荐
相关产品推荐

