文章目录
- 一、课程导入
- 二、如何去掉关于路由斜杠的警告
- 三、删除数据
- 四、查询数据
- 1.给两张表准备查询数据
- 2.查询全部数据:all()
- (2)查询index_vocation表全部记录
- 3.查询前3条数据:all()[:3]
- 4.以字典列表形式查询某个字段数据:values() - 投影运算
- 5.以元组列表形式查询某个字段数据:values_list()
- 6.使用get()函数查询一条记录
- 7.使用filter()函数查询多条记录
- 8.使用Q()函数进行查询(类似于“或”的关系)
- 9.使用~Q()表示不等于关系
- 10.使用exclude()表示不等于关系
- 11.使用count()函数查询记录数
- 12.使用distinct()函数去重
- 13.使用order_by()函数进行排序
- 14.使用annotate()函数进行分组
- 15.使用aggregate()进行聚合计算
- 16.使用union()函数合并多个查询结果
- 17.使用intersection()求查询结果的交集
- 18.使用difference()求查询结果的差
- 五、匹配符的使用
- 六、查询多表数据
一、课程导入
1.母婴商城:搭建项目开发环境
https://blog.csdn.net/m0_52158568/article/details/120922563
2.母婴商城:设置路由分发规则
https://blog.csdn.net/m0_52158568/article/details/121063372
3.母婴商城:定义商城的数据模型
https://blog.csdn.net/m0_52158568/article/details/121316441
4.母婴商城:使用QuerySet新增和更新数据
https://editor.csdn.net/md/?articleId=121453732
二、如何去掉关于路由斜杠的警告
- 运行项目,可以看到警告信息
- 修改主路由和子路由(斜杠加在主路由路径的尾巴上)
- 再次运行项目,看看还有没有讨厌的警告信息
三、删除数据
1.删除一行数据:get()与delete()
- 查看commodity_types表
- 在终端Shell模式下执行命令:Types.objects.get(id=1).delete(),删除id为1的记录
- 查看commodity_types
2.删除多行数据:filter()与delete()
- 在终端Shell模式下执行命令:Types.objects.filter(firsts=‘儿童用品’).delete()
- 删除了3条记录,查看commodity_types表
3.删除有外键的数据: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准备测试数据
- 给“李红利”设置职业
- 查看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表
- 查询job='网站设计’或id=3或title='Java开发工程师’的记录
9.使用~Q()表示不等于关系
- 查询不是“网站设计”的职业信息
- 查看index_vocation表
- 还可以有另外一种方式实现否定查询(All loads lead to Rome)
10.使用exclude()表示不等于关系
- 查询不是“网站设计”的职业信息
11.使用count()函数查询记录数
- 在职业表里查询“软件开发”的记录数
- 查看index_vocation表
12.使用distinct()函数去重
- 在职业表里查询有多少个不同的工作(job)
- 查询月薪在10000及以上的工作与个数
- 查询月薪在15000与25000之间的工作及个数
13.使用order_by()函数进行排序
- 针对全部记录按照id升序排列
- 针对全部记录按照id降序排列
- 针对全部记录按照job升序和降序排列
- 按job升序,再按id降序
14.使用annotate()函数进行分组
- 按job分组对id求和
- Sum()是一个聚合函数,上面先分组后聚合计算
15.使用aggregate()进行聚合计算
- aggregate()嵌套使用五个聚合函数:Count()、Sum()、Avg()、Max()、Min()
- 按job统计个数
- 按payment统计平均
- 按payment统计个数、和、平均、最大值和最小值
16.使用union()函数合并多个查询结果
- 将两个查询结果合并成一个结果集(payment在5000以下和在15000以上)
- 说明:union()函数可以接受多个参数,也就是说一个查询集可以和多个查询集合并
- 说明:vs1与vs2的并,vs2与vs1的并,两者结果是相同的,因为加法满足交换律
17.使用intersection()求查询结果的交集
- 求两个查询结果的交集(payment在5000以上和payment在15000以下)
- 查找以下文件:django/django/db/backends/mysql/features.py
- 查看一下django的安装位置:在命令行窗口执行 pip show django
- 把默认的False改成True
- 变通处理方法:使用&运算符来求交集
18.使用difference()求查询结果的差
- 求vs1(薪水在5000以上)与vs2(薪水在15000以下)的差
- 在features.py文件里将supports_select_difference属性值修改True
- 现将查询结果转成集合,进行差运算,再把结果转成列表
- 注意:vs1与vs2的差,vs2与vs1的差,两者结果是不相同的,要知道减法不满足交换律。
五、匹配符的使用
匹配符表
案例演示
1.查询职业表里job包含“开发”的记录
- 使用__contains匹配符来实现
2.查询职业表里薪资为8000、12000、20000的记录
- 使用__in匹配符来实现
3.查询职业表里薪资在10000与20000之间的记录
- 说明:__range匹配符是包含两个端点的,跟range()函数含头不含尾是不相同的
补充说明
1.使用get()函数查询单个记录
- 查询字段必须是主键或者唯一约束的字段,并且查询的数据必须存在,如果查询的字段有重复值或者查询的数据不存在,程序就会抛出异常信息。
- 查找id=6的职业记录
- 查找id=10的记录,会抛出异常
- 处理异常
2.使用filter()函数查询多条记录构成的列表
- 查询字段没有限制,只要该字段是数据表的某一字段即可。查询结果以列表形式返回,如果查询结果为空(查询的数据在数据表中找不到),就返回空列表。
- 查询薪资在10000以上的记录
- 查询id=10的记录,通过选择结构来处理
六、查询多表数据
- 两张表:index_vocation(主表)以name字段(外键)来关联index_personinfo(子表)的主键。
- index_vocation表
- index_personinfo表
1.正向查询:通过主表查子表
- 查找职业表id=2的记录的人员信息
- 查找薪资在10000及以上的人员信息
- 查询姓名是张三丰的职业信息
2.反向查询:通过子表查主表
- 查询人员信息表中id=2的职业信息
- 说明:“软件开发”并不在模型PersonInfo中,而在Vocation中,要通过ps去查询Vocation对象。
- 无论是正向查询还是反向查询,它们在数据库里需要执行两次SQL查询,第一次是查询某张数据表的数据,再通过外键关联获取另一张数据表的数据信息。为了减少查询次数,提高查询效率,我们可以使用select_related或prefetch_related方法实现,该方法只需执行一次SQL查询就能实现多表查询。