“Day65 Django ORM 操作数据库 进阶用法(二) 学习笔记”
今日考题
上周内容回顾
单表的增删改查
测试环境准备
如何查看orm内部的sql语句
必知必会N多条
神奇的双下划线查询
外键字段的增删改查
多表查询
今日内容概要
一、环境准备
1.1 创建数据库
参考day64
的1.1
节创建Django项目、数据库、app应用
http://localhost:4000/2022/09/15/03_Python/05_Django/day64%E7%AC%94%E8%AE%B0-DjangoORM%E8%BF%9B%E9%98%B6-01/#1-1-%E5%9F%BA%E7%A1%80%E5%87%86%E5%A4%87
1.2 创建测试脚本
编辑test.py
文件
1.3 创建数据表
编辑models.py
创建ORM对象
1.4 插入数据
author表:
authordetail表:
book表:
book_author表:
publish表:
二、查询方法
2.1 聚合查询(agreegate)
聚合查询通常情况下都是配合分组一起使用的,只要是跟数据库相关的模块
基本上都在django.db.models
里面
如果上述没有那么应该在django.db
里面
案例一:查询所有书的平均价格 (在test.py
中测试)
案例二:使用多种方法一起查询
2.2 分组查询(annotate)
MySQL分组查询都有哪些特点
分组之后默认只能获取到分组的依据 组内其他字段都无法直接获取了
严格模式:ONLY_FULL_GROUP_BY
案例一:统计每一本书的作者个数
案例二:统计每个出版社卖的最便宜的书的价格
案例三:统计不止一个作者的书
先修改数据库数据,给id为1、2的书添加作者
案例四:查询每个作者出的书的总价格
补充:
1、如果我想按照指定的字段分组该如何处理呢?
后续BBS作业会使用
2、机器上如果出现分组查询报错的情况
需要修改数据库严格模式
2.3 F查询
F查询能直接获取到表中某个字段对应的数据
案例一:查询卖出数大于库存数的书籍
案例二:将所有书籍的价格提高500块
案例三:将所有书名后面加上“爆款”两个字
2.4 Q查询
让过滤指定多个条件时,可以使用与、或、非
基本使用案例:查询卖出数大于100或者价格小于600的书籍
filter基本功能,括号内的多个参数是and
关系
使用Q查询,也使用and
关系
使用Q查询,改成or
关系
使用Q查询,改成’not’关系,查询卖出数非>100
即<=100
的书
高阶使用
三、Django中如何开启事务
四、orm中常用字段及参数
4.1 常用字段
更多字段可以参考:https://www.cnblogs.com/Dominic-Ji/p/9203990.html
4.2 自定义字段
django除了给你提供了很多字段类型之外 还支持你自定义字段
定义方法:
使用自定义字段:
五、数据库查询优化
为了展示效果,需要先设置显示SQL语句,编辑settings.py
文件,加入
5.1 ORM语句的特点
特点:惰性查询
如果仅是写了orm语句,在后面根本没有用到该语句所查询出来的参数,那么orm会自动识别,直接不执行
案例:只写查询语句,不调用,并没有执行查询操作(惰性了)
如图:
增加print
可以看到查询语句才执行了
如图:
5.2 only与defer
5.2.1 only和defer的基本使用
想要获取书籍表中所有书的名字
,一般是这样查询
改用only
,不用get
可以直接用.
获取
改用defer
,不用get
可以直接用.
获取
并且可以输出非指定的字段
5.2.2 only、defer和all的区别
all()
查询,每次都要重新走一遍数据库
only()
查询,查询only()内指定的字段不会走数据库,而查询以外的会重新走一遍数据库
defer()
查询,和only
正好相反,查询defer()内指定的字段会重走一遍数据库,而查询以外的不会重走
多用于跨表操作
5.3.1 普通查询
每循环一次就要走一次数据库,浪费资源
案例:
效率优于普通查询
效率优于普通查询
六、作业