Django的聚合查询与原生操作
Django,聚合,查询,原生,操作
2025-03-13 21:27:21 时间
聚合查询
聚合查询指的是对一个数据表中的一个字段的数据进行部分或者全部进行统计查询,例如查某个表中的平均价格、查询总价格。
反正尽量用ORM吧,这只是一种暂缓之计!
聚合查询可以分为
- 整表聚合
- 分组聚合
整表聚合
不带分组的聚合查询是指将全部的数据进行集中统计查询。
- Sum、Avg、Count、Max、Min等
from django.db.models import *
MyModels.objects.aggregate(结果变量名=聚合函数('列'))
# 以下是Django Shell的执行结果
>>> Asset.objects.aggregate(数据库ID行数=Count('id'))
{'数据库ID行数': 4}
返回的结果是以字典的方式组成的{结果变量名:值}
分组聚合
分组聚合是指通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值,即为查询集的每一项生成聚合。
- 通过先用查询结果
Mymodels.objects.values
查找要分组聚合的列
from django.db.models import *
from apps.monitor.models import Asset
Mymodels.objects.values('列1','列2')
select = Asset.objects.values('id','create_user') # id列和create_user列
- 通过返回结果的
QuerySet.annotate
方法分组聚合得到分组结果
QuerySet.annotate(结果变量名=聚合函数('列'))
print(select.annotate(myCount=Count('id')))
分组聚合的返回值为QuerySet
原生数据库操作
django也可以支持直接使用SQL语句进行查询数据库
- 查询:使用
MyModels.objects.raw()
进行数据库查询操作 - 语法:
MyModels.objects.raw(SQL语句,拼接参数)
- 返回值:返回RawQuerySet集合,只支持基础操作
- 防止SQL注入
因为SQL注入可以查出你所有用户的数据
select = Asset.objects.raw('select * from monitor_asset where id =%s',[1 od 1=1])
<RawQuerySet: select * from monitor_asset where id=1 or 1=1>
原理
- 如果你不加
[拼接参数]
那么默认的SQL语句就是 where id =1 or 1=1
- 如果加上
[拼接参数]
那么这个时候你的SQL语句就是 ‘where id=1 or 1=1’
因为int型的话变为字符串的首先会先找第一个int的值
select * from monitor_asset where 'id=1 or 1=1'
相当于第一个int值得话就是 id=1 而不是 id=1 or 1=1
完全的原生操作
完全跨过模型类操作数据库-查询/更新/删除
- 导入
cursor
包
from django.db import connection
- 用创建的
cursor
类的构造函数创建cursor
对象,为了能够保证在出现异常的时候能够释放cursor
资源,所以通常用with
语句进行操作.
from django.db import connection
with connection.cursor() as cur:
cur.execute('SQL','拼接参数')
相关文章
- 使用 Django 的 admin 定制后台,丰富自己网站的后台管理系统
- Django 使用 django-redis 作为缓存的正确用法,别忽略缓存的使用原则
- Pycharm安装django包[通俗易懂]
- Python进阶28-Django 模板层(Jinja2)
- Django Web 极简教程(六)- Django Form(Part A)
- Python进阶27-Django 路由层
- Django的聚合查询与原生操作
- vue django mysql_Python MySQL
- 在 Linux 服务器上使用 Nginx + Gunicorn 部署 Django 项目的正确姿势
- Python项目部署-使用Nginx部署Django项目
- pycharm中安装django_pycharm环境配置教程
- pycharm运行环境配置_pycharm安装django
- Python进阶34-Django 中间件
- Python进阶25-Django Web框架
- Django如何处理URL请求
- Python进阶32-Django forms组件
- pycharm安装包说pip版本不对_django库
- pycharm怎么配置django环境_pycharm环境搭建
- Django的ORM操作-创建数据
- Python进阶31-Django 分页器