day 54小结
聚合查询
级联删除 级联更新 (外键字段带来的约束)
操作外键字段管理数据时
书和出版社是一对多的关系 外键字段在书那
这个时候把出版社删了 所对应的书字段也会自动给删除
这个时候如果你把出版社主键改变了 那么书籍表中对应的出版社主键值也会改变
聚合函数
聚合函数必须用在分组之后
没有分组其实默认就是一组
- 关键字
aggregate
- 还需要导入模块
from django.db.models import Max,Min,Sum,Avg,Count
res = models.Book.objects.aggregate(sm = Sum('price'))
res = models.Book.objects.aggregate(Max('price'),Min('prince'),Sum('price'),Count('price'),Avg('price'))
分组查询
mysql
中用 group by
什么时候用分组
1.统计每一个部门的平均薪资
2.统计每一个部门的男女比例
1.关键字 annotate
2.借助于聚合函数
django.db.models import Max,Min,Sum,Avg,Count
django
中models
后面点什么 就按什么分组
统计每一本书的作者人数 书名
res = models.Book.objects.annotate(author_num = Count('authors__id')).values('author_num','title')
F与Q查询
from django.db.models import F,Q
F能够获取表中字段所对应的值
1.查询库存数大于卖出数的书
res = models.Book.objects.filter(kun_cun__gt = F('mai_cun')).values('title') # 后面的条件是数据库的其他字段值
2.将所有书的价格上涨100块
models.Book.objects.all().update(price=F('price')+100)
3.将所有书的名称后面全部加上"爆款"后缀 (了解知识点) 操作字符串数据要借助Concat方法
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.bojects.update(title=Concat(F('title'),Value('爆款')))
Q查询
models.Book.objects.filter(Q(title='xxx'),Q(kun_cun=500)) # Q包裹后 , 还是and关系
models.Book.objects.filter(Q(title='xxx') | Q(kun_cun=500)) # | 就是or的关系
models.Book.objects.filter(`Q(title='xxx') | Q(kun_cun=500)) # ` 就是not的关系
Q对象高级用法
q = Q()
q.connector = 'or' # 默认是and 可以改成or
q.children.append(('tltle','xxx'))
models.Book.objects.filter(`q) # `取反
orm
字段及参数
CharField
varchar
IntegerField
int
BigInterField
bigint
EmailField
varchar(254)
DateField
DateField
DateTimeField
auto_now: 每次修改数据的时候 都会自动将当前修改时间更新上去 实时更新
auto_now_add: 在创建数据的时候 会将当前时间自动记录 之后不会自动修改 除非人为修改
AutoField
auto_increment
BooleanField
布尔值 (该字段在储存的时候 你只需要传布尔值True或False 它会自动存成 1/0)
TextField
专门用来存大段文本
FileField
专门用来存文件路径 '/etc/data/a.txt'
upload_to = '/etc/data'
给该字段传值的时候 直接传文件对象
会自动将文件对象保存到upload_to后面的指定的文件路径
然后将路径保存到数据库
DecimalField(Field)
10进制小数
参数:
max_digits, 小数总长度
decimal_places, 小数位长度
字段参数
null 表示某个字段为空
unique 如果设置unique=Ture则该字段在此表中必须唯一
db_index 如果这个参数为True则表示此字段设置索引(索引加多了会影响写入速度)
default 设置默认值
to 设置要关联的表
to_field 设置要关联的表的字段
on_delete 当删除关联表中的数据 当前表与其关联的行的行为
models.CASCADE
删除关联数据
db_constraint 是否在数据库中创建约束 默认True
自定义字段
如何定义字段类型
class MyCharField(models.Field):
def __init__(self,max_length,*args,**kwargs):
self.max_length = max_length
# 重新调用父类的方法
super().__init__(max_length=max_length,*args,**kwargs)
def db_type(self,connection):
return 'char(%s)'%self.max_length
orm中的事务操作
什么是事务
四大特性
ACIDbi
原子性 事务中的操作不可分,要么都做,要么都不做
一致性 事务必须是是数据库从一个一致性状态变到另一个一致性状态(与原子性密切相关)
隔离性 事物之间不会被其他事务干扰
持久性 事务一旦提交,对数据影响是永久性的
数据库三大范式 设计范式
1.第一范式:
又称1NF 它指的是在一个应用中的数据都可以组织成由行和列的表格形式 且表格的任意一个行列交叉点即单元格 都不可再划分为行或列的形式(也就是确保每一列的原子性) 满足1NF是关系模式规范的最低要求 否则 将有很多基本操作在这样的关系模式中实现不了
2.第二范式:
又称2NF 它指的是在满足1NF的基础上 一张数据表的任何非主键字段都全部依赖于主键字段 没有任何非主键只依赖于主键字段的一部分 即 可以用主键字段来唯一的确定一条记录 比如学号+课程号的 联合主键 可以唯一的确定某个成绩是哪个学院的哪门成绩 缺少学号或却少课程号 都不能确定成绩的意义
3.第三范式
又称3NF 它指的是在满足2NF的基础上 数据表的任何非主键字段之间都不产生函数依赖 即非主键字段之间没有依赖关系, 全部只依赖于班级 可将学员信息和班级信息单独存放 以满足3NF
django中创建事务
from django.db import transaction
with transaction.atomic():
#在缩进中的代码中书写数据库代码
#该缩进中的所有代码都是一个事务
pass