# 昨日回顾
```python
1 聚合查询
-5个聚合函数
-from django.db.models import Avg,Max,Min,Count,Sum
-book=models.Book.objects.all().aggregate(Avg('price'))
2 分组查询
-分组就是把相同的归为一组,相同的指的就是group by 的字段
book:
id name price publish
1 金品 11.2 北京出版社
2 西游 14.2 南京出版社
3 东游 16.2 南京出版社
4 北邮 19.2 东京出版社
-按出版社分组
id name price publish
1 金品 11.2 北京出版社
2,3 西游,东游 14.2,16.2 南京出版
4 北邮 19.2 东京出版社
-取数据
-取数据时,只能取出分组字段(group by字段),还能取聚合字段(5个)
-原生sql
select avg(price),publish form book group by publish;
-对应orm
Book.objects.values('publish').annotate(avg=Avg(price)).values('publish','avg')
-多表
book:
id name price publish
1 金品 11.2 1
2 西游 14.2 2
3 东游 16.2 2
4 北邮 19.2 3
publish:
id name addr
1 北京出版社 北京
2 南京出版社 南京
3 东京出版社 东京
-连表
id name price publish id name addr
1 金品 11.2 1 1 北京出版社 北京
2 西游 14.2 2 2 南京出版社 南京
3 东游 16.2 2 2 南京出版社 南京
4 北邮 19.2 3 3 东京出版社 东京
-连表并且 group by
id name price publish name addr
1 金品 11.2 1 北京出版社 北京
2,3 西游,东游 14.2,16.2 2 南京出版社 南京
4 北邮 19.2 3 东京出版社 东京
-能取的字段,聚合函数的字段,能取group by的字段,group by表中的所有字段
-原生sql
select publish.id,publish.name,publish.addr,avg(book.price) from book join publish on book.publish=publish.id group by publish.id
-orm
Book.object.values('publish__id').annotate(avg=Avg(price)).values('avg','publish__name')
3 分组查询例子
-查询出版社id大于1的出版社id,以及出书平均价格大于30的
-Publish.objects.filter(id__gt=1).values('pk').annotate(avg=Avg('book__price')).filter(avg__gt=30).value('name','avg')
4 F和Q
-F取出字段值,可以参与比较或者运算
-Q:构造与或非 & | ~ and or not && || !
5 defer和only
-可以通过values取出咱们想要的字段,但是,一旦用了values是个字典
-我们就想要指定的几个字段,但是,返回的对象还是book对象,使用defer
-only:只取哪几个字段
-defer:不取哪几个字段
-一旦only了,就不要使用only中没有的字段了,一旦用了,又执行了一次sql,会影响效率
6 事务
-原子性:要么都成功,要么都失败
-多句的删除和更改sql,要么都成功,要么都失败
-三种粒度:第一种用的多(局部)
from django.db import transaction
with transaction.atomic():
-在一个事物当中
7 原生sql
-Book.objects.raw('原生sql')
```
# 今日内容
## 1 图书管理系统
```python
1 路由层,模板层,视图层,模型层----》图书管理系统
2 图书新增,查看,修改,删除,出版社增,查看,修改,删除,作者增,查看,修改,删除
3 CURD:create,update,retrive,delete
4 详见代码
```
# 作业
1 (拓展)新增图书,弹出模态框
2 把图书管理系统在这个基础上,完善,作者增删查改,出版社增删查改
3(拓展) python 中的in 比较的不是内存地址,而是值 不是is 而是 ==