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

