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

Flask中如何将MySQL多查询结果转为JSON列表返回?

解决Flask中MySQL多行查询结果转JSON返回的问题

错误原因

你直接用json.dumps()序列化SQLAlchemy查询返回的模型实例列表时,Python默认的JSON序列化器无法识别自定义的模型对象,因此抛出TypeError: Object of type requests is not JSON serializable错误。另外注意变量名request容易和Flask全局的request对象冲突,建议改名(比如requests_list)。

可行解决方案

方案一:给模型类添加转字典方法

先给你的requests模型添加一个to_dict()方法,将模型实例转换为可序列化的字典:

class requests(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    caregiverID = db.Column(db.Integer)
    # 其他字段...

    def to_dict(self):
        # 遍历模型所有字段,生成字典
        return {column.name: getattr(self, column.name) for column in self.__table__.columns}

然后修改视图代码:

# 改名避免冲突
requests_list = requests.query.filter(requests.caregiverID == incoming['caregiverID']).all()
# 将每个实例转为字典,组成列表
data = [item.to_dict() for item in requests_list]
# 用Flask的jsonify返回,自动处理序列化和响应头
return jsonify(data), 200

方案二:直接查询字典格式的数据

跳过模型实例化,直接查询所需字段并返回字典列表:

# 指定需要返回的字段,用with_entities查询
requests_list = requests.query.with_entities(
    requests.id, requests.caregiverID
    # 添加其他需要返回的字段
).filter(requests.caregiverID == incoming['caregiverID']).all()

# 将查询结果的元组转为字典
data = [dict(item._mapping) for item in requests_list]

# 或者用values()方法直接返回字典迭代器(SQLAlchemy 1.3+)
# requests_list = requests.query.filter(...).values('id', 'caregiverID')
# data = [dict(item) for item in requests_list]

return jsonify(data), 200

方案三:全局自定义JSON编码器

如果多个视图都需要序列化模型实例,可以自定义Flask的JSON编码器,全局生效:

from flask.json import JSONEncoder
from sqlalchemy.ext.declarative import DeclarativeMeta

class CustomJSONEncoder(JSONEncoder):
    def default(self, obj):
        # 处理SQLAlchemy模型实例
        if isinstance(obj.__class__, DeclarativeMeta):
            return {column.name: getattr(obj, column.name) for column in obj.__table__.columns}
        # 其他类型交给默认编码器处理
        return super().default(obj)

# 给Flask应用注册自定义编码器
app.json_encoder = CustomJSONEncoder

之后视图里可以直接用jsonify返回模型实例列表:

requests_list = requests.query.filter(requests.caregiverID == incoming['caregiverID']).all()
return jsonify(requests_list), 200

注意事项

  • 不要直接用json.dumps()返回字符串,jsonify()会自动设置Content-Type: application/json响应头,确保前端能正确解析JSON。
  • 避免变量名冲突,比如不要用request作为查询结果的变量名,防止覆盖Flask的全局request对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:45:41