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

