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

如何在Django中聚合订单数据适配AmChart柱状图格式?

实现Django订单数据按产品聚合并生成AmChart柱状图数据

现有代码

models.py

class Order(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True)
    order_quantity = models.PositiveIntegerField(null=True)
    date = models.DateTimeField(auto_now_add=True)
    
class Product(models.Model):
    name = models.CharField(max_length=100, choices=PRODUCTS, null = True)
    rate = models.PositiveIntegerField(null = True)

views.py

def index(request):
    orders = Order.objects.all()
    context = {
        'orders': orders,
    }
    return render(request,'index.html', context)

需求

同一产品存在多条订单记录,需按产品聚合order_quantity,生成AmChart柱状图所需格式数据:

var data = [
              {
                name: "Samsung",
                value: 35654,
              },
              {
                name: "Apple",
                value: 65456,
              },
              {
                name: "Xiomi",
                value: 45724,
              },
            ];

实现方案

1. 修改视图,聚合统计产品总订单量

在views.py中使用Django的聚合查询,按产品分组计算总订单量,并转换为目标格式:

from django.db.models import Sum
from .models import Order

def index(request):
    # 按产品名称分组,统计每个产品的总订单数量
    product_stats = Order.objects.values('product__name') \
        .annotate(total_quantity=Sum('order_quantity')) \
        .filter(product__name__isnull=False, total_quantity__isnull=False)
    
    # 转换为AmChart需要的字典结构
    chart_data = [
        {'name': item['product__name'], 'value': item['total_quantity']}
        for item in product_stats
    ]
    
    context = {
        'chart_data': chart_data,
    }
    return render(request, 'index.html', context)
  • values('product__name'):指定按关联产品的名称分组
  • annotate(total_quantity=Sum('order_quantity')):计算每组的订单数量总和
  • filter:过滤掉产品名称为空或总数量为空的无效数据

2. 在模板中生成JS数据

在index.html中,通过Django模板语法将聚合后的数据转为JavaScript数组:

<script>
var data = {{ chart_data|safe }};
// 此处编写AmChart的初始化代码
// 示例:
// am4core.ready(function() {
//   var chart = am4core.create("chartdiv", am4charts.XYChart);
//   chart.data = data;
//   // 后续配置坐标轴、柱状图系列等代码
// });
</script>
  • |safe过滤器:避免Django对JSON格式的内容进行转义,确保直接生成合法的JavaScript对象数组

注意事项

  • 确保PRODUCTS常量中的产品名称与数据库中存储的名称一致,避免因拼写/大小写差异导致分组错误
  • 如需按日期范围统计,可在查询中添加filter(date__range=[起始日期, 结束日期])来筛选订单

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:05:10