使用QuerySet删除和查询单表

首先去掉关于路由斜杠的警告

修改主路由和子路由(斜杠加在主路由路径的尾巴上),然后再次运行项目。

使用QuerySet删除和查询单表

使用QuerySet删除和查询单表

(一)删除数据 

删除数据有3种方式:删除数据表的全部数据、删除一行数据和删除多行数据.

1、删除全部数据:all()与delete()

在终端Shell模式下执行命令:Types.objects.all().delete(),删除全部记录

使用QuerySet删除和查询单表

2、删除一行数据:get()与delete() 

将数据文件改成不带BOM的UTF-8编码格式

使用QuerySet删除和查询单表

导入数据到表:python manage.py loaddata commodity_types_data.json

使用QuerySet删除和查询单表

在终端Shell模式下执行命令:Types.objects.get(id=1).delete(),删除id为1的记录

使用QuerySet删除和查询单表

 3、删除多行数据:filter()与delete()

删除全部“儿童用品” (目前只有三条记录满足条件)

使用QuerySet删除和查询单表

在终端Shell模式下执行命令:Types.objects.filter(firsts='儿童用品').delete()

使用QuerySet删除和查询单表 

4、删除有外键的数据:delete() 

删除数据的过程中,如果删除的数据设有外键字段,就会同时删除外键关联的数据。

(1)准备模型和表

在index模块的models.py中定义以下2个模型类

使用QuerySet删除和查询单表

在终端执行数据迁移命令:python manage.py makemigrations,生成数据迁移文件

使用QuerySet删除和查询单表

在终端执行数据迁移命令:python manage.py migrate index 0001_initial,生成相应的数据表

使用QuerySet删除和查询单表

(2)为index_personinfo准备测试数据 

利用批量添加数据命令,添加三条记录

使用QuerySet删除和查询单表

使用QuerySet删除和查询单表

 (3)为index_vocation准备测试数据

给“李红利”设置职业

使用QuerySet删除和查询单表

(4)级联删除id=1的李红利 

在Shell模式下执行命令:PersonInfo.objects.get(id=1).delete()

使用QuerySet删除和查询单表

(二)查询数据

1、给两张表准备查询数据 

(1)给index_personinfo表准备数据

使用QuerySet删除和查询单表

(2)给index_vocation表准备数据 

使用QuerySet删除和查询单表

2、查询全部数据:all() 

(1)查询index_personinfo表全部记录

在Shell模式下执行下列操作

使用QuerySet删除和查询单表

遍历查询集显示每个人员的详情

使用QuerySet删除和查询单表

(2)查询index_vocation表全部记录 

在Shell模式下执行下述操作

使用QuerySet删除和查询单表

3、查询前3条数据:all()[:3] 

(1)查询index_personinfo表前3条记录

使用QuerySet删除和查询单表

(2)查询index_vocation表前3条记录 

使用QuerySet删除和查询单表

4、以字典列表形式查询某个字段数据:values() - 投影运算 

查询index_vocation表job字段的数据

使用QuerySet删除和查询单表

5、以元组列表形式查询某个字段数据:values_list() 

查询index_vocation表job字段的数据

使用QuerySet删除和查询单表

6、使用get()函数查询一条记录 

查询index_vocation表id=2的记录

使用QuerySet删除和查询单表

7、使用filter()函数查询多条记录 

查询index_vocation表中job='软件开发’的记录

使用QuerySet删除和查询单表

8、使用Q()函数进行查询(类似于“或”的关系) 

查询job='网站设计’或id=3的记录

使用QuerySet删除和查询单表

9、使用~Q()表示不等于关系

查询不是“网站设计”的职业信息 

使用QuerySet删除和查询单表

10、使用exclude()表示不等于关系 

查询不是“网站设计”的职业信息

使用QuerySet删除和查询单表

11、使用count()函数查询记录数 

在职业表里查询“软件开发”的记录数

使用QuerySet删除和查询单表

12、使用distinct()函数去重

在职业表里查询有多少个不同的工作(job) 

使用QuerySet删除和查询单表

13、使用order_by()函数进行排序

针对全部记录按照id升序排列 

使用QuerySet删除和查询单表

针对全部记录按照id降序排列

使用QuerySet删除和查询单表

按job升序,再按id降序

使用QuerySet删除和查询单表

14、使用annotate()函数进行分组 

按job分组对id求和

使用QuerySet删除和查询单表

15、使用aggregate()进行聚合计算 

aggregate()嵌套使用五个聚合函数:Count()、Sum()、Avg()、Max()、Min()

按job统计个数

使用QuerySet删除和查询单表

按payment统计平均

使用QuerySet删除和查询单表

按payment统计个数、和、平均、最大值和最小值

使用QuerySet删除和查询单表

16、使用union()函数合并多个查询结果 

将两个查询结果合并成一个结果集(payment在5000以下和在15000以上)

使用QuerySet删除和查询单表

17、使用intersection()求查询结果的交集 

求两个查询结果的交集(payment在5000以上和payment在15000以下)

当前的数据库后端不支持intersection操作,需要查找以下文件:django/django/db/backends/mysql/features.py,查看一下django的安装位置:在命令行窗口执行 pip show django,根据提示就可以查找到文件所在位置。

使用QuerySet删除和查询单表

打开此文件,在文件中搜索“intersection”,把默认的False改成True

使用QuerySet删除和查询单表

变通处理方法1:使用&运算符来求交集

使用QuerySet删除和查询单表

变通处理方法2:转成集合来处理交集,再把结果转成列表 

使用QuerySet删除和查询单表

18、使用difference()求查询结果的差

在features.py文件里将supports_select_difference属性值修改True 

使用QuerySet删除和查询单表

再次执行求差运算,结果还是要报不支持的错 

变通处理方法1:现将查询结果转成集合,进行差运算,再把结果转成列表

使用QuerySet删除和查询单表

变通处理方法2:使用“-”运算符求两个集合的差

使用QuerySet删除和查询单表

(三)匹配符的使用 

1、查询职业表里job包含“开发”的记录

使用__contains匹配符来实现

使用QuerySet删除和查询单表

2、查询职业表里薪资为8000、12000、20000的记录 

使用__in匹配符来实现

使用QuerySet删除和查询单表

 3、查询职业表里薪资在10000与20000之间的记录

使用__range匹配符来实现

使用QuerySet删除和查询单表

使用原生的SQL语句来完成同样的任务

使用QuerySet删除和查询单表  补充说明

(1)使用get()函数查询单个记录

使用QuerySet删除和查询单表

查找id=10的记录,会抛出异常

使用QuerySet删除和查询单表

处理异常

使用QuerySet删除和查询单表

(2)使用filter()函数查询多条记录构成的列表 

查询薪资在10000以上的记录

使用QuerySet删除和查询单表

查询id=10的记录,通过选择结构来处理

 使用QuerySet删除和查询单表

(四)查询多表数据 

两张表:index_vocation(主表)以name字段(外键)来关联index_personinfo(子表)的主键。

1、正向查询:通过主表查子表

任务:查找职业表id=2的记录的人员信息

使用QuerySet删除和查询单表

练习:查找薪资在10000及以上的人员信息

使用QuerySet删除和查询单表

2、反向查询:通过子表查主表 

任务:查询人员信息表中id=2的职业信息

使用QuerySet删除和查询单表

(五)使用select_related()实现关联查询

1、利用PersonInfo关联查询Vocation 

任务:查询人员姓名及薪资(姓名来自PersonInfo对象,薪资来自Vocation对象),对应逆向查询

使用QuerySet删除和查询单表

不妨查看一下框架帮我们生成的关联查询语句

使用QuerySet删除和查询单表

2、利用Vocation关联查询PersonInfo 

任务:查询职业、姓名与年龄(职业来自Vocation对象,姓名与年龄来自PersonInfo对象),对应正向查询

使用QuerySet删除和查询单表

查看框架帮我们生成的查询语句

到Navicat里去执行查询语句(采用的是内部连接)

使用QuerySet删除和查询单表

任务:查询薪资在12000及以上的职业、姓名、年龄与薪资

使用QuerySet删除和查询单表

使用QuerySet删除和查询单表

(六)多表关联查询 - select_related() 

 1、准备三个模型

在index的models.py里添加三个模型类

使用QuerySet删除和查询单表

在控制台执行数据迁移命令,生成数据迁移文件

针对上述数据迁移文件执行迁移命令,生成相应的数据表

使用QuerySet删除和查询单表

 在Navicat里查看刚刚通过迁移生成的数据表

使用QuerySet删除和查询单表

2、在三张表里添加数据 

给index_province表添加记录

使用QuerySet删除和查询单表

给index_city表添加记录

使用QuerySet删除和查询单表

给index_person表添加记录

使用QuerySet删除和查询单表

3、多表查询 

使用select_related()和get()来实现三表关联查询

任务:查询“李文丽”所在城市与省份

使用QuerySet删除和查询单表

(七)多表关联查询 - prefetch_related() 

1、准备两个模型

使用QuerySet删除和查询单表

表演者Performer和节目Program是多对多关系,通过Program中的models.ManyToManyField体现出来。

2、做数据迁移,生成三张数据表 

执行python manage.py makemigrations,生成迁移文件和数据表,然后在Navicat里去查看刚才生成的数据表

使用QuerySet删除和查询单表

 3、准备数据

给index_performer表添加数据

使用QuerySet删除和查询单表

给index_program表添加数据

使用QuerySet删除和查询单表

给index_program_performer表添加数据

使用QuerySet删除和查询单表

3、使用prefetch_related()实现关联查询 

任务:查询“我爱你中国”节目有哪些表演者参加

使用QuerySet删除和查询单表

使用QuerySet删除和查询单表

任务:查询“李文丽”参加的节目

 使用QuerySet删除和查询单表

(八)原生SQL查询 

1、extra查询

任务:针对职业表,查询“软件开发”的薪资在10000以上的记录

使用QuerySet删除和查询单表

 任务:针对职业表的查询,添加一个查询字段“country”,值都是“中国”

使用QuerySet删除和查询单表

任务:针对职业表,按薪资(payment)降序查询全部记录

使用QuerySet删除和查询单表

练习:针对职业表,先按工作(job)降序排列,再按薪资(payment)升序排列,查询全部记录

使用QuerySet删除和查询单表

任务:关联职业表与人员信息表进行查询

使用QuerySet删除和查询单表

任务:上面的记录有重复,请去重显示

使用QuerySet删除和查询单表

2、raw查询

任务:查询职业表全部记录

使用QuerySet删除和查询单表

任务:查询职业表“软件开发”的记录

方法一:利用raw_query参数搞定

使用QuerySet删除和查询单表

方法二:利用raw_query与params参数搞定(注意params参数值必须是列表)

使用QuerySet删除和查询单表

任务:查询职业表“软件开发”记录,显示id字段(主键不能取别名),显示job字段,别名“工作”,显示payment字段,别名“薪资”

使用QuerySet删除和查询单表

 3、execute查询

任务:通过游标查询职业表全部记录

使用QuerySet删除和查询单表

任务:通过游标查询指标薪资在10000以上的软件开发的记录

使用QuerySet删除和查询单表

上一篇:drf代码简化的演变过程


下一篇:python-小知识点总结