Django讲课笔记10:使用QuerySet删除和查询单表

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django讲课笔记10:使用QuerySet删除和查询单表相关的知识,希望对你有一定的参考价值。

零、本讲学习目标

  1. 掌握常用的删除记录的方式
  2. 掌握常用的查询数据的方式
  3. 掌握分组、排序、并、差、交操作
  4. 掌握多表查询
  5. 掌握原生SQL的3种查询方式

一、课程导入

  1. Shell下新增数据的7种方式
  2. Shell下更新数据的6种方式

二、新课讲授

任务:如何去掉关于路由斜杠的警告

  • 运行项目,可以看到警告信息
  • 修改主路由和子路由(斜杠加在主路由路径的尾巴上)
  • 再次运行项目,看看还有没有讨厌的警告信息

(一)删除数据

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

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

  • 查看commodity_types表(14条记录)

  • 导出数据库脚本 - babies.sql


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

  • 查看commodity_types表

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

  • 导入数据有两种方式:一种是运行SQL脚本,一种是使用loaddata命令
  • 导入数据到表:python manage.py loaddata commodity_types_data.json
  • 要将数据文件改成不带BOM的UTF-8编码格式

  • 重新导入数据到表:python manage.py loaddata commodity_types_data.json
  • 查看commodity_types表
  • 在终端Shell模式下执行命令:Types.objects.get(id=1).delete(),删除id为1的记录
  • 查看commodity_types表

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

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

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

  • 删除了3条记录,查看commodity_types表

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

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

(1)准备模型和表

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

    第22行定义了name为外键,关联的是PeronInfo对象,而且是级联删除。从模型 Vocation 得知,外键字段的参数 on_delete 用于设置数据删除模式,比如模型 Vocation的外键字段name设为CASCADE模式,不同的删除模式会影响数据删除结果,说明如下:
    PROTECT 模式:如果删除的数据设有外键字段并且关联其他数据表的数据,就提示数据删除失败。
    SET_NULL模式:执行数据删除并把其他数据表的外键字段设为Null,外键字段必须将属性 Null 设为 True,否则提示异常。
    SET_DEFAULT 模式:执行数据删除并把其他数据表的外键字段设为默认值。
    SET 模式:执行数据删除并把其他数据表的外键字段关联其他数据。
    DO_NOTHING 模式,不做任何处理,删除结果由数据库的删除模式决定。

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

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

  • 查看生成的两张表:index_personinfo和index_vocation

(2)为index_personinfo准备测试数据

  • 利用批量添加数据命令,添加三条记录
  • 查看index_personinfo表

(3)为index_vocation准备测试数据

  • 给“李红利”设置职业
  • 查看index_vocation表

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

  • 在Shell模式下执行命令:PersonInfo.objects.get(id=1).delete()
  • 删除成功,总共删除了2条数据,1条是index_personinfo表的记录,1条是index_vocation表的记录。
  • 查看index_personinfo表,“李红利”记录已被删除
  • 查看index_vocation表,级联的记录(外键name_id=1)已被删除

(二)查询数据

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

(1)给index_personinfo表准备数据

INSERT INTO `index_personinfo` VALUES (1, '李红利', 25, '2018-04-15');
INSERT INTO `index_personinfo` VALUES (4, '张三丰', 22, '2020-11-22');
INSERT INTO `index_personinfo` VALUES (5, '唐小林', 28, '2015-07-16');
INSERT INTO `index_personinfo` VALUES (6, '吴文燕', 23, '2019-03-19');
INSERT INTO `index_personinfo` VALUES (7, '郑晓红', 20, '2020-12-05');

  • 查看index_personinfo表记录

(2)给index_vocation表准备数据

INSERT INTO `index_vocation` VALUES (1, '软件开发', 'Python开发工程师', 10000, 1);
INSERT INTO `index_vocation` VALUES (2, '软件开发', 'Java开发工程师', 12000, 3);
INSERT INTO `index_vocation` VALUES (3, '文员', '前台文员', 3000, 2);
INSERT INTO `index_vocation` VALUES (4, '需求分析', '系统需求分析师', 9000, 3);
INSERT INTO `index_vocation` VALUES (5, '网站设计', '前端开发', 8000, 4);
INSERT INTO `index_vocation` VALUES (6, '项目经理', 'Python项目经理', 20000, 5);
INSERT INTO `index_vocation` VALUES (7, '软件开发', 'C开发工程师', 12000, 6);
INSERT INTO `index_vocation` VALUES (8, '软件开发', 'android开发工程师', 8000, 7);

  • 查看index_vocation表记录

三、课堂小结

四、课后作业

五、拓展内容

以上是关于Django讲课笔记10:使用QuerySet删除和查询单表的主要内容,如果未能解决你的问题,请参考以下文章

Django:防止模型上的 QuerySet 删除?

Django讲课笔记01:Django简介

Django讲课笔记02:Django环境搭建

Django讲课笔记04:Django项目的调试

django中Queryset的删除问题分页问题

Django讲课笔记06:搭建项目开发环境