如何在Django Rest Framework中将数据库数据格式化为图表所需结构
现有代码问题
- 维度映射逻辑颠倒:你需要的输出是「每个状态对应全部测试名称的计数数组」,但现有逻辑是每新增一个测试名称就生成一个状态条目,完全不符合目标结构要求
- 循环变量作用域错误:内层for循环遍历status结束后,你给response追加条目时用到的
status变量只会保留遍历的最后一个值,也就是In Progress - 没有做计数累加:同一个测试名称+状态的组合如果出现多次,现有逻辑不会累加计数,只会覆盖或者遗漏
Python标准库没有专门适配这个场景的内置函数,手动实现转换逻辑非常简单,不需要引入额外依赖,正确实现如下:
转换代码实现
注意:你给出的目标结构语法存在笔误,外层应该是字典而非列表,以下代码按修正后的合理结构输出:
# 先定义固定的状态顺序,和你要输出的顺序保持一致 STATUS_ORDER = ['Active', 'Failed', 'Success', 'In Progress'] # 第一步:提取所有不重复的测试名称作为labels,保留首次出现顺序 labels = [] seen_names = set() for item in data: if item['name'] not in seen_names: seen_names.add(item['name']) labels.append(item['name']) # 如果需要按名称升序排序,可替换为:labels = sorted(seen_names) # 第二步:初始化状态计数映射,每个状态对应全0的计数数组,长度和labels一致 status_count_map = { status: [0] * len(labels) for status in STATUS_ORDER } # 第三步:遍历原始数据填充计数 for item in data: name = item['name'] status = item['status'] count = item['count'] # 拿到当前测试名称在labels中的索引 name_idx = labels.index(name) # 给对应状态的对应位置累加计数 status_count_map[status][name_idx] += count # 第四步:组装为目标结构 result = { 'labels': labels, 'data': [ {'name': status, 'data': counts} for status, counts in status_count_map.items() ] }
运行上述代码得到的result和你要求的目标输出完全匹配,可直接返回给前端使用。
内容的提问来源于stack exchange,提问作者Hassan Shahbaz
相关产品推荐
相关产品推荐

