一、聚合查询

聚合查询时指对一个数据表中的一个字段的数据进行部分或全部进行统计查询,比如查询数据库中全部书的平均价格,查询所有书的总个数等,

都要用聚合查询

 

聚合查询分为

整表聚合

分组聚合

 

二、整表聚合

不带分组的聚合查询是指将全部数据进行集中统计查询

聚合函数[需要导入]:

导入方法: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语句',拼接参数)

 

风月都好看,人间也浪漫.