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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:50:43