day 54小结

聚合查询

​ 级联删除 级联更新 (外键字段带来的约束)

​ 操作外键字段管理数据时
​ 书和出版社是一对多的关系 外键字段在书那
​ 这个时候把出版社删了 所对应的书字段也会自动给删除
​ 这个时候如果你把出版社主键改变了 那么书籍表中对应的出版社主键值也会改变

聚合函数

​ 聚合函数必须用在分组之后
​ 没有分组其实默认就是一组

  1. 关键字 aggregate
  2. 还需要导入模块
    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
djangomodels后面点什么 就按什么分组

统计每一本书的作者人数 书名
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

猜你喜欢

转载自www.cnblogs.com/LZF-190903/p/11968458.html