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) 最后把上面的都关联上,得到最终的筛选条件

 

posted @ 2021-04-12 17:22  Chris_Ma  阅读(157)  评论(0)    收藏  举报