没有合适的资源?快使用搜索试试~ 我知道了~
首页Django+Echarts画图实例详解
资源详情
资源评论
资源推荐
Django+Echarts画图实例详解画图实例详解
主要介绍了Django+Echarts画图实例详解,可以了解Django中aggregate和annotate函数的使用方法及其Django+Echarts绘制柱状图的完整示例,感兴趣的小伙伴们可
以参考一下
所有演示均基于Django2.0
阅读此篇文章你可以:
了解Django中aggregate和annotate函数的使用方法
获取一个Django+Echarts绘制柱状图的完整示例
需求说明需求说明
一张会议记录表,里边有一个字段存放会议举行的地点,例如北京、上海、洛阳等等,需要取举行会议最多的前20个地点绘制成柱状图展示,项目为前后端分离的架构
需求分析需求分析
看了需求主要有三个关键点:
1.前后端分离:前端只负责页面渲染,后端提供API负责数据输出
2.需要绘制成柱状图:绘制图表的第三方插件有很多,我们这里就选择百度开源的echarts,简单好用且功能强大
3.取举行会议最多的前20个地点:了解一点SQL知识的话就知道需要先要对地点字段进行group by,然后order by desc倒序,最后limit取前20
那么在Django中应该如何group by,并在group by之后order by排序,最后limit呢?这里我们介绍django的两个函数 aggregate 和 annotate
aggregate
aggregate聚合函数,用于对QuerySet整个对象结果的汇总,例如获取员工总数(COUNT),平均(AVG)年龄,最大(MAX)年龄,最小(MIN)年龄,销售总额(SUM)等,输出的
结果是一个字典
我们有一个model如下:
class Employee(models.Model):
name = models.CharField(max_length=32, verbose_name='姓名')
age = models.IntegerField(verbose_name='年龄')
salary = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='薪资')
想要获取员工的工资总额,我们可以这样写
>>> from django.db.models import Sum
>>> Employee.objects.aggregate(Sum('salary'))
{'salary__sum': Decimal('5000.00')}
想要同时获取员工的平均年龄、最大年龄和最小年龄,我们可以这样写
>>> from django.db.models import Avg, Max, Min
>>> Employee.objects.aggregate(Avg('age'), Max('age'), Min('age'))
{'age__avg': 23.333333333333332, 'age__max': 30, 'age__min': 18}
annotate
annotate函数区别于aggregate函数的一个最重要的地方是annotate函数 输出的结果是一个QuerySet对象 ,这个非常重要,aggregate函数最后输出的结果是个字典,也就不能再在字典的
基础上进行QuerySet操作了,而annotate函数执行完成后输出QuerySet对象可以继续调用Django内置的filter、order_by等函数来完成更加复杂的查询计算操作
用到annotate函数的逻辑往往比较复杂,Django非常人性化的提供了query方法,方便查看annotate生成的SQL语句帮助我们确定执行过程
以上边的实际需求为例,model如下:
class EventInfo(models.Model):
event_location = models.CharField(max_length=30)
class Meta:
db_table = "app_event_info"
我们需要先对地点event_location进行group by:
>>> _t = EventInfo.objects.values_list('event_location').annotate(Count('id'))
# values_list可以获取evnet_location的元组列表。
# values_list方法加个参数flat=True可以获取event_location的值列表。
group by之后我们就需要order by排序了,如果我们不知道order by的字段,我们可以通过query先查看group by生成的SQL语句
>>> print(_t.query)
SELECT "app_event_info"."event_location", COUNT("app_event_info"."id") AS "id__count" FROM "app_event_info" GROUP BY "app_event_info"."event_location"
这个时候可以看到实际上输出的结果有一个叫 id__count 的字段表示地点的总数,那么我们就可以接着对地点总数进行排序了,因为是要倒叙,需要在字段名 id__count 前边加上 - 号来表示倒序
>>> _x = _t.order_by('-id__count')
>>>
>>> print(_x.query)
SELECT "app_event_info"."event_location", COUNT("app_event_info"."id") AS "id__count" FROM "app_event_info" GROUP BY "app_event_info"."event_location" ORDER BY "id__count" DESC
最后limit取前二十,Django中limit可以直接通过QuerySet结果后加python的数组切片语法来实现,就像[0:20](其中0可以省略)相当于limit 20一样,[10:20]意思为取第10到第20条数据
>>> _y = _x[:20]
>>>
>>> print(_y.query)
SELECT "app_event_info"."event_location", COUNT("app_event_info"."id") AS "id__count" FROM "app_event_info" GROUP BY "app_event_info"."event_location" ORDER BY "id__count" DESC LIMIT 20
上边的每一步我们都通过query打印了SQL,确定是我们想要的结果了。需求分析清楚,所有的关键点我们也都知道怎么处理了,那么接下来实现就水到渠成了。
实现代码实现代码
URL如下:
from django.urls import path
from django.views.generic.base import TemplateView
from .views import echarts_data
urlpatterns = [
path('echarts/', TemplateView.as_view(template_name='echarts.html'), name='echarts-url'),
path('api/echarts/', echarts_data, name='api-echarts')
]
weixin_38747216
- 粉丝: 5
- 资源: 882
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 2023年中国辣条食品行业创新及消费需求洞察报告.pptx
- 2023年半导体行业20强品牌.pptx
- 2023年全球电力行业评论.pptx
- 2023年全球网络安全现状-劳动力资源和网络运营的全球发展新态势.pptx
- 毕业设计-基于单片机的液体密度检测系统设计.doc
- 家用清扫机器人设计.doc
- 基于VB+数据库SQL的教师信息管理系统设计与实现 计算机专业设计范文模板参考资料.pdf
- 官塘驿林场林防火(资源监管)“空天地人”四位一体监测系统方案.doc
- 基于专利语义表征的技术预见方法及其应用.docx
- 浅谈电子商务的现状及发展趋势学习总结.doc
- 基于单片机的智能仓库温湿度控制系统 (2).pdf
- 基于SSM框架知识产权管理系统 (2).pdf
- 9年终工作总结新年计划PPT模板.pptx
- Hytera海能达CH04L01 说明书.pdf
- 数据中心运维操作标准及流程.pdf
- 报告模板 -成本分析与报告培训之三.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0