其他分享
首页 > 其他分享> > 使用QuerySet删除和查询单表

使用QuerySet删除和查询单表

作者:互联网

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

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

(一)删除数据 

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

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

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

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

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

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

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

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

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

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

 

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

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

(1)准备模型和表

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

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

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

(2)为index_personinfo准备测试数据 

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

 (3)为index_vocation准备测试数据

给“李红利”设置职业

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

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

(二)查询数据

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

(1)给index_personinfo表准备数据

(2)给index_vocation表准备数据 

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

(1)查询index_personinfo表全部记录

在Shell模式下执行下列操作

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

(2)查询index_vocation表全部记录 

在Shell模式下执行下述操作

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

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

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

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

查询index_vocation表job字段的数据

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

查询index_vocation表job字段的数据

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

查询index_vocation表id=2的记录

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

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

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

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

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

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

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

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

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

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

12、使用distinct()函数去重

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

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

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

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

按job升序,再按id降序

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

按job分组对id求和

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

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

按job统计个数

按payment统计平均

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(三)匹配符的使用 

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

使用__contains匹配符来实现

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

使用__in匹配符来实现

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

使用__range匹配符来实现

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

  补充说明

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

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

处理异常

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

查询薪资在10000以上的记录

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

 

(四)查询多表数据 

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

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

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

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

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

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

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

1、利用PersonInfo关联查询Vocation 

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

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

2、利用Vocation关联查询PersonInfo 

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

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

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

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

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

 1、准备三个模型

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

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

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

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

2、在三张表里添加数据 

给index_province表添加记录

给index_city表添加记录

给index_person表添加记录

3、多表查询 

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

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

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

1、准备两个模型

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

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

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

 3、准备数据

给index_performer表添加数据

给index_program表添加数据

给index_program_performer表添加数据

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

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

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

 

(八)原生SQL查询 

1、extra查询

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

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

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

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

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

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

2、raw查询

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

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

方法一:利用raw_query参数搞定

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

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

 3、execute查询

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

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

标签:index,记录,职业,QuerySet,查询,单表,数据,id
来源: https://blog.csdn.net/Fairy3364/article/details/121751112