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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:42:00