Flask-SQLAlchemy如何将BaseQuery查询结果转为字典列表
Flask-SQLAlchemy查询结果转字典列表实现
实现步骤
- 首先调用BaseQuery对象的
.all()方法,触发数据库查询拿到对应模型实例的列表,避免在查询构造器阶段就尝试访问不存在的属性 - 遍历每个模型实例,提取指定字段组装为独立字典,最终拼接为符合要求的字典列表
常用实现方式
1. 显式字段映射(适合固定字段返回的场景)
直接在列表推导式中手动枚举需要返回的字段,完全控制输出的键值对内容:
# 拉取按创建时间排序的全量查询结果 events = events_db.query.order_by(events_db.date_created).all() # 转换为指定字段的字典列表 result = [ { "id": record.id, "location": record.location, "event": record.event, "date_created": record.date_created, "background": record.background } for record in events ]
这种方式的优点是逻辑透明,不会带出模型中定义但不需要返回的冗余字段,字段映射规则可以根据需求灵活调整,转换完成后可直接通过result[行索引][字段名]的方式访问任意位置的字段值
2. 通用列提取(适合字段多、需频繁调整返回字段的场景)
基于模型定义的表结构自动提取所有业务字段,避免重复手写字段名:
def serialize_model(record): # 遍历模型绑定的所有表字段,自动排除SQLAlchemy内部生成的状态属性 return { column.name: getattr(record, column.name) for column in record.__table__.columns } # 批量转换查询结果 result = [serialize_model(record) for record in events]
这种方式的优点是可复用性强,后续模型新增需要返回的字段时,不需要修改转换逻辑,只要在模型中定义对应列就会自动被提取,减少重复代码
注意事项
- 不要直接读取模型实例的原生
__dict__属性做转换,该属性会附带_sa_instance_state这类SQLAlchemy内部维护的非业务字段,会造成结果冗余 - 如需要排除部分不需要返回的字段,只需要在字典生成的逻辑中跳过对应列名即可,不需要调整整体转换流程
内容的提问来源于stack exchange,提问作者Ivica
相关产品推荐
相关产品推荐

