Django 与图表的数据交互

在Django开发过程中,遇到了需要图表进行数据可视化的需要。因此查询了相关文档,并记录下如何实现与图表的数据交互。 本人是个前端小白,只会改不会写(套模板)。
仅供参考!!!

环境相关

Django (版本不限,当然不同的版本有不同的后端代码写法。本文环境为Django 3.1)
echarts (前端的画图框架,导入JS包即可) 点击网址可以找到模板 网址
JQuery (用于Ajax请求 导入JS包即可 在文中会有JS包地址)

实现思路(需要理解的请结合代码来看)

  1. 后端方面主要涉及到了ajax,其实就是前端对后端请求一个特定的地址,后端收到请求后,将数据整理并打包成json格式向前端发送,有点类似于在写API接口。
  2. 前端方面。主要有两个点:echarts 和Ajax 。
  3. echarts 中可以看到,生成的模板里面有2个data项,用于储存数据信息制作表格。 (不同的图表有不同的数据点,本文只有2个data项,生成折线图)
  4. Ajax 用于向后端发送请求。
  5. 在编写过程中,先将echarts 表的数据项清空(data : [])。 后续通过ajax请求向后端请求数据包,并提取对应的数据加入到echarts 表的数据项中。

代码:

urls.py

   re_path('ajax_line/', views.ajax_line, name='ajax_line'),

ajax请求接口:

def ajax_line(request):
    # 数据处理
    # 要求: 统计前5个月的销售额
    DateSum = []
    Date = []
    # 取前5个月的日期
    for i in range(0,5):
    # 此行代码有bug ,当i大于月份时会报错,可以采用 每月一号 - 1天 后,在将datetime对象的天数替代为1即可。此问题已解决,但是本人源码不在身边无法上传
        month = datetime.date(datetime.date.today().year, datetime.date.today().month - i, 1)  # 当月一号
        Date.append(month)
        # 分别取30天的销售额
        ShopList = ShopOrders.objects.filter( add_time__year=month.year,  add_time__month=month.month)
        sum = 0
        for j in ShopList :
            sum += j.Money
        DateSum.append(sum)
    #  数据打包
    jsondata = {
        "Date": Date,
        "DateSum": DateSum
    }
    cities = []
    for n, c in zip(jsondata['Date'], jsondata['DateSum']):
        b = {}
        b['name'] = n
        b['count'] = c
        cities.append(b)
    test_dic = {}
    test_dic['data'] = cities
    # 将数据转换成json格式,方便ajax调用
    return JsonResponse(test_dic, safe=False)

models

  from django.db import models
from datetime import datetime
# Create your models here.

class Shop(models.Model):
    Name = models.CharField(max_length=50, verbose_name='名称')
    Barcode = models.CharField(max_length=50, verbose_name='条形码' ,default ='')
    Money = models.IntegerField(default=0, verbose_name='单价')
    number = models.IntegerField(default=0, verbose_name='库存')
    Other = models.CharField(max_length=100, verbose_name='备注' ,default='无')
    objects = models.Manager()
    def __str__(self):
        return self.Name
    class Meta:
        verbose_name = '商品'
        verbose_name_plural = verbose_name

class ShopOrders(models.Model):
    Produce = models.ManyToManyField(Shop, verbose_name='产品清单', blank=True)
    Money = models.IntegerField(default=0, verbose_name='合计')
    add_time = models.DateTimeField(default=datetime.now, verbose_name='时间')
    Other = models.CharField(max_length=100, verbose_name='备注' , default='无')
    Owner =  models.CharField(max_length=50, verbose_name='销售人员',default ='')
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    YEAR_IN_SCHOOL_CHOICES = (
        (FRESHMAN, '微信'),
        (SOPHOMORE, '现金'),
        (JUNIOR, '支付宝'),
    )
    Type = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )

    objects = models.Manager()
    def __str__(self):
        return self.Owner
    class Meta:
        verbose_name = '商品订单'
        verbose_name_plural = verbose_name

前端

<!--
   THIS EXAMPLE WAS DOWNLOADED FROM https://echarts.apache.org/examples/zh/editor.html?c=line-simple
-->
<!DOCTYPE html>
<html lang="zh-CN" style="height: 100%">
<head>
  <meta charset="utf-8">
</head>
<body style="height: 100%; margin: 0">

<h1 style="Text-align:center"> 月度销售情况</h1>>
  <div id="container" style="height: 100%"></div>


 <script type="text/javascript" src="https://fastly.jsdelivr.net/npm/echarts@5.3.3/dist/echarts.min.js"></script>
 <script type="text/javascript" charset="utf8" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>

  <script type="text/javascript">
    var dom = document.getElementById('container');
    var myChart = echarts.init(dom, null, {
      renderer: 'canvas',
      useDirtyRect: false
    });
    var app = {};
    
    var option;

    option = {
  xAxis: {
    type: 'category',
    data: []
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data: [],
      type: 'line'
    }
  ]
};

    if (option && typeof option === 'object') {
      myChart.setOption(option);
    }
    window.addEventListener('resize', myChart.resize);

    myChart.showLoading();
    var names = [];
    var brower = [];
    $.ajax({ // ajax的方式动态获取后端代码
        type: 'get',
        url: '/index/ajax_line/',
        dataType: 'json',
        success: function (result) {
                $.each(result.data, function (index, item) {
                names.push(item.name);
                brower.push({
                    value: item.count,
                    name: item.name
                });
            });
            myChart.hideLoading();
            myChart.setOption({
                xAxis: {
                    data: names
                },
                series: [{
                    data: brower
                }]
            });
        },
        error: function (errormsg) {
            alert('errormsg');
            myChart.hideLoading();
        }
    });

  </script>

</body>
</html>

成果展示

在这里插入图片描述

参考博客

echarts动态获取Django数据

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django是一个开放源代码的Web应用程序框架,它可以用于快速开发Web应用程序,并且拥有丰富的功能和灵活的设计。在Django中,我们可以使用不同的库和工具来创建图表实例,帮助我们更直观地展示数据和统计信息。 在Django中,最常用的创建图表实例的库是matplotlib和django-chartit。Matplotlib是一个Python绘图库,用于创建各种类型的图表,包括折线图、柱状图、饼图等。通过与Django的结合,我们可以在网页中使用Matplotlib创建动态的图表实例,展示数据的趋势和变化。另外,django-chartit是一个基于jQuery和Highcharts的Django图表库,它提供了丰富的图表类型和交互功能,可以帮助我们快速创建各种精美的图表实例。 在Django中创建图表实例的过程通常包括几个步骤。首先,我们需要准备好要展示的数据,并且在Django的视图函数中进行数据的处理和计算。然后,我们可以使用matplotlib或django-chartit将处理好的数据转换为图表实例,并将其嵌入到网页中。最后,在网页的模板文件中,我们可以使用Django模板语言将图表实例渲染到页面上,从而实现数据可视化的效果。 总之,Django提供了丰富的工具和库来创建图表实例,帮助我们更直观地展示数据和统计信息。无论是使用matplotlib还是django-chartit,都可以在Django中轻松实现图表的创建和展示,为Web应用程序增加更多的功能和价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值