Django模型层2
一、聚合查询
聚合函数
即 Max,Min,Sum,Avg,Count 几种函数。
聚合函数必须用在分组之后,没有分组默认整体就是一组。
注意事项:
使用聚合函数需要先使用关键字:
aggregate还需要将聚合函数模块导入
(只要跟数据库相关的功能都在
django.db.models里面;如果不在,可能在
django.db里面)
from django.db.models import Max,Min,Sum,Avg,Count
# 1.筛选出价格最高的书籍的
res = models.Book.objects.aggregate(mr = Max('price'))
print(res)
# {'mr': Decimal('666.60')}
# 2.求书籍总价格
res = models.Book.objects.aggregate(sm = Sum('price'))
print(res)
# {'sm': Decimal('1286.30')}
# 3.求书籍平均价格
res = models.Book.objects.aggregate(av = Avg('price'))
print(res)
# {'av': 128.63}
# 4.一起使用
res = models.Book.objects.aggregate(Max('price'),Min('title'),Count('price'),Avg('price'))
print(res)
# {'price__max': Decimal('666.60'), 'title__min': '大主宰', 'price__count': 10, 'price__avg': 128.63}
二、分组查询
什么时候需要分组?
1. 统计每一个部门的平均薪资
2. 统计每一个部门的男女比例
利用group by进行分组查询
注意事项:
分组需要使用关键字:
annotate也需要借助于聚合函数
from django.db.models import Max,Min,Sum,Avg,Count
# models.哪个表名 ,就对哪个表分组
# 1.统计每一本书的作者个数 书名 和对应的作者人数
res = models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num')
print(res)
# 2.统计出每个出版社卖的最便宜的书的价格 出版社的名字 价格
res = models.Publisher.objects.annotate(min_price=Min('book__price')).values('name','min_price')
print(res)
# 按照其他字段分组
res = models.Publisher.objects.values('addr').annotate(min_date=Min('book__publish_date')).values('name','min_date')
print(res)
# 3.统计不止一个作者的图书
# (1.先拿书及对应的作者数
# (2.再筛选出大于一的图书 书名 作者数目
res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('title','author_num')
print(res)
# 4.查询各个作者出的书的总价格 作者名字 总价格
res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')
print(res)
三、F与Q查询
用之前需要先将F和Q类导入。
1. F类
F能够通过字符串获取到表中对应的字段的值。
# from django.db.models import F,Q
# 1. 查询库存数大于卖出数的书籍
# 后面的条件是来自于数据库的其他字段值
res = models.Book.objects.filter(kun_cun__gt = F('inventory')).values('title')
print(res)
# 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
ret3 = models.Book.objects.update(title=Concat(F('title'), Value('新款')))
2. Q类
Q类可以传一个条件参数实例化一个对象,通过这个Q对象可以和别的Q对象在筛选条件时进行‘or’或者‘not’的判断。
# from django.db.models import F,Q
# Q包裹之后,用逗号还是and关系,默认就是为and2
res = models.Book.objects.filter(Q(title='三国演义'),Q(kun_cun=500))
# |就是or的关系
res = models.Book.objects.filter(Q(title='最终进化')| Q(price=500))
# ~就是not关系
res = models.Book.objects.filter(~Q(title='星辰变')| Q(price=500))
print(res)
# Q对象高级用法
q = Q()
q.connector = 'or' # 默认是and,改成or,内部就是在修改Q类的default值
q.children.append(('title','武动乾坤'))
q.children.append(('price__gt',500))
# 将两个条件添加进q对象中,直接比较q对象
res = models.Book.objects.filter(q)
res = models.Book.objects.filter(~q) # 取反
print(res)
四、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中的事务操作
1. 什么是事务
事务就是一组原子性的SQL语句,或者说一个独立的工作单元。
如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。
如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。
也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。
不成功便成仁。
2. 四大特性
ACID
原子性(atomicity)
事务操作必须被视为一个不可分割的最小工作单元。
整个事务中的所有操作要么全部提交成功,要么全部失败回滚。
对于一个事务来说,不可能只执行其中的一部分操作。
这就是事物的原子性。
一致性(consistency)
数据库总是从一个一致性的状态转换到另外一个一致性的状态。
确保数据库在事务进行前后的数据总量保持一致。
隔离性(isolation)
简单地说,就是事务与事务之间是隔离的。
这也就意味着,一个事务所做的修改在最终提交以前,对其他事务是不可见的。
也就是说,当某一条数据开始进行一个事务但没有提交的时候,另一个事务也要对这条数据进行修改,那后面一个事务看见的就是数据没有被第一个事物修改过的最初的样子。
持久性(durability)
一旦事务提交,则其所作的修改就会永久保存到数据库中。
即使此时系统崩溃,修改的数据也不会丢失。
3. 三大范式
第一范式
每一列属性都是不可再分的属性值,确保每一列的原子性。
第二范式
每一行的数据只能与其中一列相关,确保表中的每列都和主键相关,避免数据重复。
第三范式
数据不能存在传递关系,即每列都跟主键列直接相关,而不是间接相关。
Django模型层2的更多相关文章
- django 模型层(2)
Django 模型层(2) 多表操作---模型之间的关系 1 一对一:作者----作者详细信息 2 一对多:书籍----出版社 3 多对多:书籍----作者 一 创建模型(主键(id)自动创建) 没 ...
- Django模型层(2)
<!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ...
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
- Django模型层之ORM
Django模型层之ORM操作 一 ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ...
- Django模型层之单表操作
Django模型层之单表操作 一 .ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ...
- Django模型层之更多操作
Django模型层之更多操作 一 .ORM字段 1.1 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为 ...
- Django模型层(各种表及表数据的操作)
目录 一.Django模型层 0. django模型层的级联关系 1. 配置django测试脚本 (1)方式一 (2)方式二 2. orm表数据的两种增删改 (1)方式一: (2)方式二: 3. pk ...
- day 70 Django基础五之django模型层(二)多表操作
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...
- day 69 Django基础五之django模型层(一)单表操作
Django基础五之django模型层(一)单表操作 本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现 ...
- day 57 Django基础五之django模型层之关联管理器
Django基础五之django模型层之关联管理器 class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况 ...
随机推荐
- jackson学习之八:常用方法注解
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Codeforces Round #604 (Div. 2) C. Beautiful Regional Contest(贪心)
题目链接:https://codeforces.com/contest/1265/problem/C 题意 从大到小给出 $n$ 只队伍的过题数,要颁发 $g$ 枚金牌,$s$ 枚银牌,$b$ 枚铜牌 ...
- Luogu U13059 某种密码
应该没什么用的题目链接 题目背景 关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY.若KEY=∑▒[Ai*Bi],则密文 ...
- Codeforces Round #637 (Div. 2)
比赛链接:https://codeforces.com/contest/1341 A - Nastya and Rice 题意 有 n 堆米,每堆质量在 [a-b,a+b] 之间,这些米的总质量是否可 ...
- 【noi 2.6_2988】计算字符串距离(DP)
题意: 给两个字符串,可以增.删.改,问使这两个串变为相同的最小操作数. 解法:(下面2种的代码主要区别在初始化和,而状态转移方程大家可挑自己更容易理解的方法打) 1.f[i][j]表示a串前i个和b ...
- hdu5407CRB and Candies (逆元+数学公式)
Problem Description CRB has N different candies. He is going to eat K candies. He wonders how many c ...
- AtCoder Beginner Contest 183 E - Queen on Grid (DP)
题意:有一个\(n\)x\(m\)的棋盘,你需要从\((1,1)\)走到\((n,m)\),每次可以向右,右下,下走任意个单位,\(.\)表示可以走,#表示一堵墙,不能通过,问从\((1,1)\)走\ ...
- Codeforces Round #547 (Div. 3) D. Colored Boots (贪心,模拟)
题意:有两个字符串,两个字符串中的相同字符可以相互匹配,\(?\)可以和任意字符匹配,输出最大匹配的字符数量和它们分别两个字符串中的位置. 题解:很容易贪心,我们先遍历第一个字符串,然后在第二个字符串 ...
- POJ 2195 & HDU 1533 Going Home(最小费用最大流)
这就是一道最小费用最大流问题 最大流就体现到每一个'm'都能找到一个'H',但是要在这个基础上面加一个费用,按照题意费用就是(横坐标之差的绝对值加上纵坐标之差的绝对值) 然后最小费用最大流模板就是再用 ...
- Redundant Paths POJ - 3177 把原图变成边—双连通图
无向图概念:(这里的x->y表示x和y之间有一条无向边)1.桥:对于一个无向图,如果删除某条边后,该图的连通分量增加,则称这条边为桥 比如1->2->3->4这样一个简单得图一 ...