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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:15:03