首先去掉关于路由斜杠的警告
修改主路由和子路由(斜杠加在主路由路径的尾巴上),然后再次运行项目。
(一)删除数据
删除数据有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以上的软件开发的记录