404.ORM实现数据查询
一.查询前的准备
表的结构:
二.查询操作的返回值
1.QuerySet对象
QuerySet(对象的list集合) -->[ object, object, object, object]
all() --- 所有
filter() --- 满足条件的所有
exclude() --- 排除对象
order_by() --- 排序
reverse() -- 反序
distinct() -- 去重
以all()为例子
其他查询操作示例:
2.特殊的QuerySet对象
values(): 返回一个可迭代的字典序列
values_list(): 返回一个可迭代的元祖序列
values():
得到的是一个字典的list集合
values_list()
得到的是一个元组类型:
3.具体的一个对象
get() --- 满足条件的第一个对象
first() --- 整个集合的第一个对象
last() --- 整个集合的最后一个对象
4.返回布尔类型的值
exists() --- 是否存在满足条件的对象
5.返回数字
Count()--- 返回结果集的数量
三.ORM查询的基本条件
基本运算符 --- 判断相等
= 或者 exact
基本运算符 --- 大于和小于
gt 等价于 >
gte 等价于 >=
lt 等价于 <
lte 等价于 <=
基本运算符 --- in
ln --- 判断是否属于一个范围
基本运算符 --- range
range 等价于 between --- and
基本运算符 --- isnull
示例如下:
练习:
四.ORM中的模糊查询
1.startswith(区分大小写:当你查询的是包含英文字母) / istartswith(不区分:当你查询的是包含英文字母) 条件%
2.endswith / iendswith 区分大小写/不区分 %条件
3.contains / icontains 区分大小写/不区分 %条件%
相关练习:
五.ORM中的聚合函数
COUNT:求所选记录行数
AVG:求所选记录的平均值
SUM:为所选记录求和
MAX:求所选记录的最大值
MIN:求所选记录的最小值
在使用这些聚合函数的时候要先进行导入对应的模块:from django.db.models import Count, Max, Min, Sum, Avg
使用方法:Book.objects.aggregate()
相关练习:
六.ORM中分组查询
“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理
使用方法:
方法:Book.objects.annotate()
举例解释第一条:
models.Student.objects.values('gender')得到了所有男生和女生的信息,
.annotate(number=Count('gender')) 在上一句得到所有男生和女生的信息之后,再按照性别进行分组,分成两组,一组男生,后面是男生的总人数
一组是女生,后面是女生的总人数
注意:如下图
七.ORM中的F表达式和Q表达式
F表达式的作用一:在构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较
在如图所示的原生sql语句中的两个字段的比较,在ORM中实现就需要使用F( )表达式实现
在ORM中使用F( )表达式实现:
F表达式的作用二:应用于批量修改
比如在原有的书的价格上+1元:
models.Book.object.update(bookprice = F('bookprice') + 1.0)
八.连接查询
ORM中的连接只能实现原生sql语句中的内连接.
要在ORM中实现比较复杂的功能的时候,就需要ORM和原生sql语句相结合的方式来实现
模型之间的三种关系:(一对多是用的比较多的)
正向查询:通过一类的条件查找多类的数据(由一查多:给定的条件在主键表中,要查询的内容在外键表中)
多类名.objects.filter(关联属性_一类属性名 = 具体条件)
其他例子:
对上面一查多的实例再次进行解释以加深印象:
sno是Student的主键,是BorrowBook的外键
因为是BorrowBook的外键,所以sno必须存在于Student中,
sno在Student中,并且找到了 sname=陈鹏 的
就保证陈鹏存在于Student中
然后回到BorrowBook中找哪些是陈鹏借的书,得到的结果以字典的形式返回
反向查询:通过多类的条件查找一类的数据 (由多查一:给定的条件在外键表中,要查询的内容在主键表中)
一类名.objects.filter(多类名小写_多类名属性 = 具体条件)
其他例子:
九.多表连接案例演示
1)先写表的关联图
2)对于多对一的关系 写上 多类名小写
对于一对多的关系 写上 关联属性_一类属性名 = 具体条件
3) 最后把上面的都关联上,得到最终的筛选条件