Django中查询数据库并在Chart.js展示市场侵权数量饼图求助
Django + Chart.js 饼图数据异常修复方案
先确认模型结构
假设你的models.py中侵权记录模型如下(如果实际结构不同,对应调整字段名即可):
from django.db import models class Infringement(models.Model): marketplace = models.CharField(max_length=100) # 存储marketplace1、marketplace2这类标识 # 其他业务字段(比如侵权类型、日期等)
修正视图的数据库查询逻辑
核心问题是未正确按marketplace分组统计数量,用Django的聚合查询就能解决:
修改views.py:
from django.shortcuts import render from django.db.models import Count from .models import Infringement def dashboard(request): # 按marketplace分组,统计每个市场的侵权记录数 stats = Infringement.objects.values('marketplace').annotate(total_infringements=Count('id')) # 提取Chart.js需要的标签和数据列表 labels = [item['marketplace'] for item in stats] data = [item['total_infringements'] for item in stats] return render(request, 'dashboard.html', {'labels': labels, 'data': data})
values('marketplace')指定分组字段,annotate(...)完成每组的数量统计,最终会得到类似[{'marketplace': 'marketplace1', 'total_infringements':5}, ...]的结果。
修正模板中的Chart.js配置
确保模板正确解析Django传递的列表数据:
<canvas id="infringementPieChart"></canvas> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script> const ctx = document.getElementById('infringementPieChart').getContext('2d'); new Chart(ctx, { type: 'pie', data: { labels: {{ labels|safe }}, datasets: [{ label: '侵权数量', data: {{ data|safe }}, backgroundColor: [ '#ff6384', '#36a2eb', '#ffce56', '#4bc0c0', '#9966ff' ], borderColor: '#fff', borderWidth: 1 }] }, options: { responsive: true, plugins: { legend: { position: 'right' }, title: { display: true, text: '各市场侵权数量分布' } } } }); </script>
- 必须加
|safe过滤器:Django默认会把列表转成带引号的字符串,|safe能让JS直接识别为数组。
额外排查要点
- 如果
marketplace是外键(比如关联Marketplace模型),要把values('marketplace')改成values('marketplace__name')(假设外键模型有name字段)。 - 需要过滤特定数据的话,在查询链中加
.filter(...),比如.filter(is_resolved=False)只统计未处理的侵权。 - 可以在视图中打印
stats的内容,确认是否符合预期格式,比如print(stats),方便排查数据问题。
内容的提问来源于stack exchange,提问作者Farid
相关产品推荐
相关产品推荐

