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

如何将Django QuerySet转换为单个字典?适配Bokeh DataTable报错

问题原因

queryset.values()返回的是包含多条记录字典的迭代器,每条记录是一个多键值的字典(你的场景里每条有11个字段)。而dict(qs)试图把这个迭代器转成单个字典,这不符合dict()的要求——它只接受长度为2的元素(键值对),所以触发了报错。

正确解法

Bokeh的ColumnDataSource需要的是列格式字典:键是字段名,值是该字段所有数据组成的列表。我们需要把Django返回的行格式数据(每条记录一个字典)转换成这种结构。

修改后的代码:

queryset = Model.objects.all()
# 把values()结果转成行格式列表
rows = list(queryset.values())

# 将行格式数据转换为ColumnDataSource需要的列格式
if rows:
    columns_data = {field: [row[field] for row in rows] for field in rows[0].keys()}
else:
    # 处理空查询集的情况,避免索引报错
    columns_data = {}

# 过滤出实际数据库字段,排除反向关联等非存储字段
valid_fields = [field for field in Model._meta.get_fields() if field.concrete]
# 匹配字段名和对应的verbose_name
columns = [TableColumn(field=field.name, title=field.verbose_name) for field in valid_fields]

source = ColumnDataSource(columns_data)
data_table = DataTable(source=source, columns=columns)

script, div = components(data_table)

额外提示

如果你的项目已经引入了pandas,可以用更简洁的方式转换:

import pandas as pd

queryset = Model.objects.all()
df = pd.DataFrame(queryset.values())
source = ColumnDataSource(df)

pandas会自动帮你完成行格式到列格式的转换,省去手动处理的步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:55:42