15-聚合查询和原生数据库操作
一、聚合查询
聚合查询时指对一个数据表中的一个字段的数据进行部分或全部进行统计查询,比如查询数据库中全部书的平均价格,查询所有书的总个数等,
都要用聚合查询
聚合查询分为
整表聚合
分组聚合
二、整表聚合
不带分组的聚合查询是指将全部数据进行集中统计查询
聚合函数[需要导入]:
导入方法:from django.db.models import * 聚合函数:Sum,Avg,Count,Max,Min 语法:MyModel.objects.aggregare(结果变量名=聚合函数(‘列’)) 返回结果:结果变量名和值组成的字典 格式为:{'结果变量名':'值'}
三、分组聚合
分组聚合是指通过计算查询结果中每一个对象所关联的对象集合从而得出总计值(也可以是平均值或总和) 即为查询集的每一项生成聚合
语法:QuerySet.annotate(结果变量名=聚合函数(''列))
返回值:QuerySet
步骤:
1.通过先用查询结果Mymodel.objects.values查找查询要分组聚合的列 res = Mymodel.objects.values('列1','列2') 2.res.annotate(结果变量名=Sum('id '))
四、原生数据库操作
Django也支持之间用sql语句的方式通信数据库
查询:使用MyModel.objects.raw(sql语句,拼接参数) #只可以查询
返回值:RawQuerySet集合对象,只支持做基础操作,比如循环
五、sql注入防范-拼接参数
使用原生语句时小心SQL注入,如果用户通过数据上传,将恶意的sql语句提交给服务器,从而达到攻击效果
#错误--不要直接格式化字符串 query = 'SELECT * FROM myapp_person WHERE last_name = %s' % lname Person.objects.raw(query) #正确--使用Django raw函数 功能进行安全转义 name = 'Doe' Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s', [name])
六、原生数据库操作-cursor
完全跨过模型类操作数据库-查询/更新/删除
1.导入cursor所在的包
from django.db import connection
2.用创建cursor类的构造函数创建cursor对象,再使用cursor对象,为保证在出现异常时能释放cursor资源,通常使用with语句进行创建
示例:
with connection.cursor() as cur: cur.execut('sql语句',拼接参数)
风月都好看,人间也浪漫.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)