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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 09:13:02