使用QuerySet删除和查询数据表(一)

本文详细介绍了Django中使用QuerySet进行数据删除和查询的各种方法,包括删除一行、多行及全部数据,以及查询全部、部分数据、分组、聚合计算等操作,同时探讨了如何处理外键级联删除和查询结果的合并、交集、差集等复杂场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)删除数据

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

1.删除一行数据:get()与delete()

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

在这里插入图片描述

  • 查看commodity_types表

在这里插入图片描述

2.删除多行数据:filter()与delete()

  • 删除全部“儿童用品”

在这里插入图片描述

  • 查看commodity_types表

在这里插入图片描述

3.删除全部数据:all()与delete()

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

在这里插入图片描述

  • 查看commodity_types表

在这里插入图片描述

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

(1)准备模型和表

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

(2)为index_personinfo准备测试数据

  • 利用批量添加数据命令,添加三条记录
    在这里插入图片描述

  • 查看index_personinfo表

在这里插入图片描述

(3)为index_vocation准备测试数据

  • 给"id=1"设置职业

在这里插入图片描述

  • 查看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表准备数据

  • 添加数据

在这里插入图片描述

  • 查看index_personinfo表记录

在这里插入图片描述

(2)给index_vocation表准备数据

  • 添加数据
    在这里插入图片描述
  • 查看index_vocation表记录

在这里插入图片描述

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

(1)查询index_personinfo表全部记录

  • 在Shell模式下执行下列操作

在这里插入图片描述

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

在这里插入图片描述

(2)查询index_vocation表全部记录

在Shell模式下执行下述操作
在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

  • 其实,利用列表的切片运算,可以实现更多情况的查询,比如查询第6条记录
    在这里插入图片描述

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的记录

在这里插入图片描述

  • 查看index_vocation表
    在这里插入图片描述

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

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

在这里插入图片描述

  • 查看index_vocation表
    在这里插入图片描述

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

  • 查询不是“网站设计”的职业信息
    在这里插入图片描述

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

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

在这里插入图片描述

  • 查看index_vocation表
    在这里插入图片描述

12.使用distinct()函数去重

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

在这里插入图片描述

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

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

在这里插入图片描述

  • 针对全部记录按照id降序排列
    在这里插入图片描述

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

  • 按job分组对id求和

在这里插入图片描述

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

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

(1) 按job统计个数

在这里插入图片描述

(2) 按payment统计平均

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

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

  • 求两个查询结果的交集(payment在5000以上和payment在15000以下)
    在这里插入图片描述
    在这里插入图片描述
  • 当前的数据库后端不支持intersection操作
  • 查找以下文件:django/django/db/backends/mysql/features.py
  • 查看一下django的安装位置:在命令行窗口执行 pip show django

在这里插入图片描述

  • 按图索骥

在这里插入图片描述
找到 supports_select_intersection,将False改为True
在这里插入图片描述
在这里插入图片描述

  • 再次执行两个结果集的交集运算,还是报错

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

  • 求vs1(薪水在5000以上)与vs2(薪水在15000以下)的差

在这里插入图片描述

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

在这里插入图片描述

  • 再次执行求差运算,结果还是要错
  • 变通处理方法1:现将查询结果转成集合,进行差运算,再把结果转成列表

在这里插入图片描述

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

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值