Flask SQLAlchemy如何实现类似Django queryset.values()的返回效果
解决方案
首先修正你原有查询代码的小问题:查询时需要指定对应的模型对象,正确写法如下:
all_projects = session.query(Project).all()
以下是两种适配懒加载场景、可直接生成符合要求的字典列表的方案:
方法1:使用实例__dict__属性快速转换
该方法无需额外依赖,只要过滤掉SQLAlchemy自动生成的私有属性即可得到纯净的字段字典:
# 写法1:循环遍历 dict_list = [] for project in all_projects: # 过滤掉以_开头的SQLAlchemy内置私有字段 project_dict = {k: v for k, v in project.__dict__.items() if not k.startswith('_')} dict_list.append(project_dict) # 写法2:更简洁的列表推导式 dict_list = [{k: v for k, v in obj.__dict__.items() if not k.startswith('_')} for obj in all_projects]
方法2:显式查询字段直接转字典(懒加载场景推荐)
该方法性能更高,查询时仅拉取需要的字段,不会触发不必要的懒加载关联查询,返回结果无多余属性:
# 手动指定需要查询的字段,返回的Row对象可直接转字典 all_project_rows = session.query(Project.id, Project.name, Project.credit).all() dict_list = [row._asdict() for row in all_project_rows]
如果表字段较多不想手动枚举,可以通过模型映射动态获取所有列:
# 动态获取Project表的所有字段 columns = [col for col in Project.__table__.columns] all_project_rows = session.query(*columns).all() dict_list = [row._asdict() for row in all_project_rows]
转换为Pandas DataFrame
最终得到的dict_list格式和Django values()返回结果完全一致,直接传入即可生成DataFrame:
import pandas as pd df = pd.DataFrame(dict_list)
懒加载场景注意事项
如果你的Project模型配置了关联关系,默认懒加载状态下上述方法不会自动加载关联数据,也不会触发额外的SQL查询。如果你需要把关联字段也加入字典列表,建议提前用joinedload/selectinload预加载关联数据,避免出现N+1查询问题。
内容的提问来源于stack exchange,提问作者Rifat Rakib
相关产品推荐
相关产品推荐

