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

