Django中不溜教程(7)模型层(4)之优化与杂项

前言

如果你以阅读过针对模型层三个章节的讲解,那么恭喜你,你已经基本能够进行模型层的大部分开发了,当前章节我们主要介绍的是优化与一些细节的Django模型层知识。

索引

事务

Django中的事务默认采用自动提交的策略

聚合

原生的sql语句提供了聚合函数max()min()avg()sum()count()进行最大,最大,平均,合计,技术的计算,而且经常与分组group by配合使用。
我们这里学习Django中怎么实现聚合。

count()计数

django中count的实现比较简单,QuerySet有count()函数,返回集合的个数。
代码:

>>>from CURD.models import Student,Teacher,Classmy
>>>count=Student.objects.count()  #查询学生总人数
>>>count=Student.objects.filter(age__lt=18).count() #查询未成年人的人数
>>>ageavg=Student.objects.

aggregate()实现Min.Max.Avg.Sum

最小,最大,平均和合计需要aggregate()函数来实现。

>>>from django.db.models import Avg,Min,Max,Sum
>>>from CURD.models import Student,Teacher,Classmy
>>>ageavg=Student.objects.all().aggregate(Avg('age')) #求学生的平均年龄
>>>maxage=Student.objects.filter(name='张三').aggregate(Max('age')) #求叫张三的学生的最大年龄
>>>reslut=Student.objects.all().aggregate(Max('age'),Sum('age'))#求最大年龄和年龄综合,返回对象是一个字典{'age__max': XX, 'age__sum': XX}

annotate()实现分组聚合

很多时候我们的聚合会配合着分组,在mysql中是group by,在Django中使用QuerySet的annotate()函数。

原生sql

通过我们对Django的QuerySet相关Api学习发现我们好像已经不再需要原生的sql语句也能够实现我们绝大部分的sql操作,其实Django同样支持原生的Sql语句。对于仍然习惯原生sql或者使用orm难以实现情况下推荐这种方式。
Django提供了两种方式执行原生 SQL 查询:

  • 使用Manager.raw() 来 执行原生查询并返回模型实例,
  • 完全不用模型层 直接执行自定义 SQL。

注意:使用原生sql需要注意sql注入。

Manager.raw()

Manager指的就是Model.objects对象,raw()函数针对的是查询,不能够进行增删改。
语法:

#执行原生sql,返回模型实例
#第一个参数: sql语句,可带有占位符 %s。必选参数
#第二个参数:参数列表。参数化传递参数。可选参数。
#第三个参数: 一个字典,指定查询语句中的字段名和模型中的字段名的映射。可选参数。
#返回RawQuerySet,与QuerySet类型,可以迭代的获取对象实例。
Manager.raw(raw_query, params=None, translations=None)

我们来看一个实例:

>>>sql ='select id ,name ,age  from CURD_student s where age  >  %s limit 5'   #%s无单引号
>>>params=[18]  如果有多个占位符,参数列表按照顺序。
>>>rqs=Student.objects.raw( sql,params)  #以防止sql注入的方式执行。

注意1: raw()要求查询的字段中必须包含主键,不然会报错误:

 Raw query must include the primary key

注意2: raw()返回的RawQuerySet也支持切片的写法,但是它的切片并不是在数据库层级进行截取数据,而是对在python实例进行数据截取,推荐在mysql使用limit offset实现分页。

注意3: 为了防止sql注入。查询的变量一定要通过占位符+params的方式。

注意4:raw()可省略字段,也就是说sql语句中只查询了id和name,但仍然可以通过实例对象获取age的值,不过Django会多一次查询,主键字段不能省略。

注意5: 若要在查询中包含文本的百分号,你需要在传入参数使用两个百分号。

自定义 SQL

Django还支持直接访问数据库的完全不涉及到模型操作的方式,常用于增删改的操作。
使用流程:
使用对象 django.db.connection,它是数据库连接对象。随后调用 connection.cursor() 来获取一个指针对象。再调用 cursor.execute(sql, [params]) 来执行该 SQL ,最后通过 cursor.fetchone(),或 cursor.fetchall() 获取结果数据。

案例:

集成已存在的数据库表

Django如果开发新的项目它的自动根据Model对象生成表结构的功能十分实用,不仅如此它还支持集成旧数据库,也就是它还能根据已存在的表自动生成模型代码。

我们这里只做初步的介绍,它的使用步骤:
1 保证setting.py文件中的 DATABASES 属性配置正确,也就是NAME,ENGINE,USER,PASSWORD,HOST,PORT这些连接数据库常量。
2 通过Django内置的 inspectdb工具自动生成Model对象。

$ python manage.py inspectdb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值