Django(23)-ORM聚合查询和原生数据库操作

Django(1)-简介

Django(2)-创建项目及默认项目目录结构介绍

Django(3)-配置文件详解

Django(4)-URL和视图

Django(5)-路由配置实例

Django(6)-请求及响应

Django(7)-Get请求和Post请求

Django(8)-设计模式

Django(9)-模板层简介与入门实例

Django(10)-模板层的变量和标签

Django(11)-模板层的过滤器和继承

Django(12)-url反向解析

Django(13)-静态文件

Django(14)-应用及分布式路由

Django(15)-模型层及ORM介绍

Django(16)-ORM基础字段及选项

Django(17)-ORM创建数据

Django(18)-ORM常用的查询函数详解及实例演示

Django(19)-ORM条件查询

Django(20)-ORM更新操作及实例演示

Django(21)-ORM删除操作及实例演示

Django(22)-ORM中F对象和Q对象

Django(23)-ORM聚合查询和原生数据库操作

Django(24)-admin后台管理设置步骤以及常见样式详解

Django实战技巧(1)-开发测试生产环境配置切换处理技巧

Django实战技巧(2)-git代码仓分支管理技巧

Django实战技巧(3)-项目配置

1、 聚合查询

  • 聚合查询是指对一个数据表中的一个字段的数据进行部分或者全部进行统计查询,如查询人员信息表中所有人的平均年龄,查询所有人员信息的个数等,都要使用到聚合查询
  • 聚合查询分为整表聚合和分组聚合

2、整表聚合

  • 整表聚合就是不带分组的聚合查询,即将全部数据进行集中统计查询
  • 聚合查询需要导入聚合函数
    • from django.db.models import *
    • 常见的聚合函数有Sum,Avg,Count,Max,Min
  • 语法:
    • MyModel.objects.aggregate(结果变量名=聚合函数(‘列’))
    • 返回结果:结果变量名和值组成的字典,即{“结果变量名”:值}

实例如下:

>>> from app1.models import Person
>>> from django.db.models import *
>>> Person.objects.aggregate(num=Count("id"))
{'num': 4}
>>> Person.objects.aggregate(age_max=Max("age"))
{'age_max': 20}
>>> Person.objects.aggregate(age_min=Min("age"))
{'age_min': 20}
>>> Person.objects.aggregate(age_sum=Sum("age"))
{'age_sum': 80}
>>>

3、分组聚合

  • 分组聚合就是指通过计算查询结果中的每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合
  • 语法:
    • QuerySet.annotate(结果变量名=聚合函数(‘列’))
    • 返回值为QuerySet
      为演示分组聚合,先试用下面语句向数据库中插入两条数据
>>> p=Person(name="helen",age=30,sex="woman")
>>> p.save()
>>> p=Person(name="July",age=28,sex="woman")
>>> p.save()

通过数据库后台查询命令此时数据情况如下:
在这里插入图片描述
下面即演示分组聚合的应用场景即效果:即分组聚合之后的结果还可以继续使用filter过滤

>>> p=Person.objects.values("sex")
>>> p.annotate(num=Count("sex"))
<QuerySet [{'sex': 'man', 'num': 4}, {'sex': 'woman', 'num': 2}]>
>>>
>>>> p.annotate(num=Count("sex")).filter(num__gt=2)
<QuerySet [{'sex': 'man', 'num': 4}]>

4、原生数据库操作

  • 查询:
    • 语法1:MyModel.objects.raw(sql语句),不安全,存在SQL注入风险
    • 语法2:MyModel.objects.raw(sql语句,条件参数),此种安全,django默认处理掉SQL注入风险
    • 返回值:RawQuerySet集合对象,只支持基础操作,比如循环等

实例:

>>> persons=Person.objects.raw("select * from person")
>>> persons
<RawQuerySet: select * from person>
>>> for p in persons:
...     print(p)
...
姓名:zhangsan,年龄:20,性别:man
姓名:lisi,年龄:20,性别:man
姓名:wangwu,年龄:20,性别:man
姓名:Jack,年龄:20,性别:man
姓名:helen,年龄:30,性别:woman
姓名:July,年龄:28,性别:woman
>>> for p in persons:
...     print(p.sex)
...
man
man
man
man
woman
woman
>>>
  • 完全跨过模型类操作数据库-查询、更新、删除
    • 导入cursor所在的包:from django.db import connecton
    • 用创建cursor类的构造函数创建cursor对象,再使用cursor对象,为保证在出现异常时能释放cursor资源,通常使用with语句,即:
from django.db import connection
with connection.cursor() as cur:
	cur.execute(sql语句,拼接参数)

实例如下:

>>> from django.db import connection
>>> with connection.cursor() as cur:
...     rs=cur.execute("select * from person")
...     print(rs)
...
6

注意:虽然django支持原生的操作数据库,但是这里不推荐,既然已经使用django了,推荐使用django提供的ORM框架

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

redrose2100

您的鼓励是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值