11.28 总结
Posted lidandanaa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11.28 总结相关的知识,希望对你有一定的参考价值。
- 级联更新 级联删除 外键字段带来的约束
- 操作外键字段管理数据的时候, 出版社和书是一对多关系 外键字段在书那里
- 如果把出版社删了 所对应的书也会自动删除
- 如果把出版社主键值改了 书表中对应的出版社主键值也会自动随之更改
聚合函数
- 必须用在分组之后,没有分组其实默认整体是一组
- 关键字 aggregate
- 用之前需要导入模块
from django.db.models import Max,Min,Sum,Avg,Count
- 只要跟数据库相关的功能 基本上都在django.db.models里面
- 如果不在 可能直接在django.db里面
from django.db.models import Max,Min,Sum,Count,Avg
#筛选出价格最高的书籍
res= models.Book.objects.aggregate(mr=Max('price'))
print(res)
#求书籍总价格
res=models.Book.objects.aggregate(sm=Sum('price'))
print(res)
#书籍平均价格
res=models.Book.objects.aggregate(av=Avg('price'))
print(res)
#合并使用
res=models.Book.objects.aggregate(Max('price'),Min('price'),Sum('price'),Count('price'),Avg('price'))
print(res)
运行结果:
{'price__max': Decimal('444.33'), 'price__min': Decimal('222.22'), 'price__sum': Decimal('999.89'), 'price__count': 3, 'price__avg': 333.296667}
分组查询
- group by,什么时候需要分组
- 统计每一个部门的平均薪资
- 统计每一个部门的男女比例
- 关键字 annotate
- 借助于聚合函数
- django中models后面.什么,就按照什么分组
#统计每一本书的作者个数 书名 和对应的作者人数 (正向按字段)
res=models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num')
print(res)
#统计出每个出版社卖的最便宜的书的价格 出版社的名字 价格
res=models.Publish.objects.annotate(min_price=Min('book__price')).values('name','min_price')
print(res)
# 按照其他字段分组
res = models.Publish.objects.values('想要分组的字段名').annotate(min_price=Min('book__price')).values('name','min_price')
print(res)
#统计不止一个作者的图书
#先拿书及对应的作者数 再筛选出大于一的图书 书名 作者数
res=models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('title','author_num')
print(res)
F与Q查询
from django.db.models import F,Q
F能够获取表中字段所对应的值
from django.db.models import F,Q
#查询库存数大于卖出数的书籍
res=models.Book.objects.filter(inventory__gt=F('sold')).values('title')
print(res)
#将所有书的价格上涨100块
models.Book.objects.all().update(price=F('price')+100)
# 将所有书的名称后面全部加上 "爆款" 后缀 了解知识点 操作字符串数据需要借助于Concat方法
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(title=Concat(F('title'),Value('新款')))
# 查询一下书籍名称是红楼梦 或者 库存数是500的书籍
res=models.Book.objects.filter(Q(title='红楼梦')|Q(inventory=500)) #|是or关系
res1=models.Book.objects.filter(~Q(title='红楼梦')|Q(inventory=500)) #~是not关系
print(res,res1)
#Q对象高级用法
q=Q()
q.connector='or' #默认是and 如果需要or关系就使用这行代码
q.children.append(('title','红楼梦'))
q.children.append(('inventory__gt',500))
res=models.Book.objects.filter(q) #取反
res1=models.Book.objects.filter(~q) #取反
print(res)
print(res1)
orm字段及参数
CharField varchar
IntegerField int
BigIntegerField bigint
EmailField varchar(254)
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,小数位长度
- 自定义char字段
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中的事务操作
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤销。
事务的四大特性
- 数据库事务transaction正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
- 原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始的最初状态,就像这个事务从来没有执行过一样。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
- 隔离性:隔离状态执行事务,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。
- 持久性:在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库中,并不会被回滚。
from django.db import transaction
with transaction.atomic():
#在缩进的代码中书写数据库操作
#该缩进内的所有代码 都是一个事务
pass
数据库三大范式
- 为了优化数据存储方式,所以应该规范化建立数据库,这些规范形成三大范式。
- 第一范式:要求数据库表的每一列都是不可分割的原子数据项(1NF)
- 第二范式:(1NF基础上)需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分有关(针对联合主键)(2NF)
- 第三范式:(2NF基础上)需要确保数据库表中的每一列数据都和主键直接相关,而不能间接相关。
以上是关于11.28 总结的主要内容,如果未能解决你的问题,请参考以下文章
11.28 限定某个目录禁止解析php 11.29 限制user_agent 11.30/11.31