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框架