orm中的聚合函数,分组,F/Q查询,字段类,事务
一、聚合函数
聚合函数单独使用意义不大,一般与分组联用
没有分组其实默认整体就是一组
常用的聚合函数有:
Max Min Sum Avg Count
1. 基础语法
聚合函数要先导入才能使用
from django.db.models import Max, Min, Sum, Count, Avg # 温馨提示:只要跟数据库相关的功能 基本上都在django.db.models里面
# 如果不在 可能直接在django.db里面
用关键字
aggregate实现例子:res = models.Book.objects.aggregate(mr = Max('price')) mr 为该聚合字段的名字,随便取。也可以不命名,django会自动命名为: 字段名__聚合函数名
2. Max Min Sum Avg Count用法
(1) Max()/Min()
# 1.筛选出价格最高的书籍的
from django.db.models import Max, Min, Sum, Count, Avg
res = models.Book.objects.aggregate(mr = Max('price'))
res1 = models.Book.objects.aggregate(mr = Min('price'))
(2)Avg()
# 2.求书籍总价格
from django.db.models import Max, Min, Sum, Count, Avg
res = models.Book.objects.aggregate(sm = Sum('price'))
(3)Count()
# 3.求书籍平均价格
from django.db.models import Max, Min, Sum, Count, Avg
res = models.Book.objects.aggregate(av = Avg('price'))
(4)聚合函数联用
# 4.一起使用
from django.db.models import Max, Min, Sum, Count, Avg
res = models.Book.objects.aggregate(Max('price'),Min('price'),Sum('price'),Count('price'),Avg('price'))
二、分组查询
分组一般配合聚合函数使用
django中models后面点什么,就按照什么分组。若点的是模型类(表),则默认以该表的主键分组
关键字:
annotate
1. 分组查询实例
- 以下查询到的都是queryset对象
# 1. 统计每一本书的作者个数 书名 和对应的作者人数
res = models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num')
# 2. 统计出每个出版社卖的最便宜的书的价格 出版社的名字 价格
res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name','min_price')
# 3. 按照其他字段分组
res = models.Publish.objects.values('想要分组的字段名').annotate(min_price=Min('book__price')).values('name','min_price')
# 4. 统计不止一个作者的图书
# 先拿书及对应的作者数
# 再筛选出大于一的图书 书名 作者数目
res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('title','author_num')
# 5. 查询各个作者出的书的总价格 作者名字 总价格
res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')
三、F与Q查询
F与Q查询前要先导入才能使用
from django.db.models import F,Q
1. F查询实例
- 当条件中的运算符号的右边为表中其他字段时,使用F方法来组成该条件右边的部分。如
user_id > book_id中的book_id
from django.db.models import F # 一定要先导入
# 1. 查询库存数大于卖出数的书籍
res = models.Book.objects.filter(ku_cun__gt = F('mai_chu')).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
ret3 = models.Book.objects.update(title=Concat(F('title'), Value('新款')))
2. Q查询实例
- Q查询主要用来改变条件与条件之间的逻辑关系。即
and/or/not
from django.db.models import Q # 一定要先导入
# 1.查询一下书籍名称是三国演义 或者 库存数是500的书籍
res = models.Book.objects.filter(title='三国演义',ku_cun=500) # and关系
res1 = models.Book.objects.filter(Q(title='三国演义'),Q(kun_cun=500)) # Q包裹之后逗号还是and关系
res = models.Book.objects.filter(Q(title='三国演义') | Q(ku_cun=500)) # |就是or的关系
res = models.Book.objects.filter(~Q(title='三国演义') | Q(ku_cun=500)) # ~就是not关系
Q方法的高级用法
from django.db.models import Q
q = Q()
q.connector = 'or' # 默认是and 可以改成or
q.children.append(('title','三国演义')) # 放元组 , title='三国演义' : 原关键字参数变成了元组形式
q.children.append(('ku_cun__gt',500))
# 查询书名是三国演义或者库存数量大于500的书籍
res1 = models.Book.objects.filter(q)
res2 = models.Book.objects.filter(~q) # 取反
四、orm字段及其参数
1. 常见的orm字段
# 除了主键和外键字段外,所有字段中都有的参数 null=布尔值 表示是否可以为空
CharField varchar 参数: max_length
IntegerField int
BigIntegerField bigint
EmailField varchar(254)
DateField
DateTimeField
'''
DateField 和 DateTimeField 中都有两个参数 auto_now 和 auto_now_add,默认都是False
auto_now:每次修改数据的时候,不管你有没有指定修改时间字段,时间字段都会自动将当前时间修改成这次修改的当前时间,即实时更新
auto_now_add:在创建数据的时候,会将当前时间自动记录,之后不会自动修改,除非你人为指定修改
'''
AutoField 参数:primary_key
BooleanField 布尔值,后端传布尔值,但是数据库里对应的存 0和1
TextField 专门用来存大段文本
FileField 专门用来文件路径字符串 如:'/etc/data/a.txt'
参数: upload_to = 本地一个路径
给该字段传值的时候 直接传文件对象
会自动将文件对象保存到upload_to后面指定的文件路径中
然后将路径保存到数据库
DecimalField(Field)
- 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度
2. 自定义字段
自定义
char字段实例
class MyCharField(models.Field): # 继承models中字段类
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
3. 外键字段
# 以其他表的主键字段当做外键,直接 to=类名
publish = models.ForeignKey(to='Publish')
# 以其他表的其他字段为外键, 直接 to_Field=字段名
# 外键删除操作
如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过on_delete来指定。可以指定的类型如下:
如: on_delete=CASCADE
1.CASCADE:级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。
2.PROTECT:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。
3.SET_NULL:设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。
4.SET_DEFAULT:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。
5.SET():如果外键的那条数据被删除了。那么将会获取SET函数中的值来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。
6.DO_NOTHING:不采取任何行为。一切全看数据库级别的约束
4. 字段中的常用属性
1. null
如果设置为True,Django将会在映射表的时候指定是否为空。默认是为False。在使用字符串相关的Field(CharField/TextField)的时候,官方推荐尽量不要使用这个参数,也就是保持默认值False。因为Django在处理字符串相关的Field的时候,即使这个Field的null=False,如果你没有给这个Field传递任何值,那么Django也会使用一个空的字符串""来作为默认值存储进去。因此如果再使用null=True,Django会产生两种空值的情形(NULL或者空字符串)。如果想要在表单验证的时候允许这个字符串为空,那么建议使用blank=True。如果你的Field是BooleanField,那么对应的可空的字段则为NullBooleanField。
2. db_column
这个字段在数据库中的名字。如果没有设置这个参数,那么将会使用模型中属性的名字。
3. default
默认值。可以为一个值,或者是一个函数,但是不支持lambda表达式。并且不支持列表/字典/集合等可变的数据结构。
4. primary_key
是否为主键。默认是False。
5. unique
在表中这个字段的值是否唯一。一般是设置手机号码/邮箱等
五、orm中的事务操作
要先导入才能使用事务
from django.db import transaction
1. 开启/关闭事务
# with 和文本操作中的with管理上下文功能一样,可以自动关闭事务
with transaction.atomic():
# 在缩进的代码中书写数据库操作
# 该缩进内的所有代码 都是一个事务
pass
orm中的聚合函数,分组,F/Q查询,字段类,事务的更多相关文章
- django 中的聚合和分组 F查询 Q查询 事务cookies和sessions 066
1 聚合和分组 聚合:对一些数据进行整理分析 进而得到结果(mysql中的聚合函数) 1aggregate(*args,**kwargs) : 通过对QuerySet进行计算 ,返回一个聚合值的字典. ...
- 聚合函数与F/Q表达式
聚合函数 取名: field + __ + 聚合函数名字 ,如:price__avg:可传关键字参数修改名字:avg=Avg("price"): aggregate:不会返回一个 ...
- 聚合和分组F,Q和事物,cookie,session
聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典. 键的名称是聚合值的标识符,值是计算出来的聚合值.键的名称是按照字段和聚合函数的名称自动生成出 ...
- 18 12 06 sql 的 基本语句 查询 条件查询 逻辑运算符 模糊查询 范围查询 排序 聚合函数 分组 分页 连接查询 自关联 子查询
-- 数据的准备 -- 创建一个数据库 create database python_test charset=utf8; -- 使用一个数据库 use python_test; -- 显示使用的当前 ...
- 分组\聚合\F\Q查询
一.分组和聚合查询 1.aggregate(*args,**kwargs) 聚合函数 通过对QuerySet进行计算,返回一个聚合值的字典.aggregate()中每一个参数都指定一个包含在字典中的 ...
- Django框架08 /聚合查询、分组、F/Q查询、原生sql相关
Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 目录 Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 1. 聚合查询 2. 分组 3. F查询和Q查询 4. o ...
- Django day08 多表操作 (五) 聚合,分组查询 和 F,Q查询
一:聚合,分组查询 二:F, Q查询
- django----聚合查询 分组 F与Q查询 字段 及其 参数
目录 一.orm补充查询 聚合查询 1-1 分组查询 1-2 F与Q查询 1-3 二. 字段及其参数 常用字段 AutoField IntegerField CharField DateField D ...
- 在MongoDB中实现聚合函数 (转)
随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的 ...
随机推荐
- (转)arcengine+c# 修改存储在文件地理数据库中的ITable类型的表格中的某一列数据,逐行修改。更新属性表、修改属性表某列的值。
作为一只菜鸟,研究了一个上午+一个下午,才把属性表的更新修改搞了出来,记录一下: 我的需求是: 已经在文件地理数据库中存放了一个ITable类型的表(不是要素类FeatureClass),注意不是要素 ...
- Git_mergetool_tutorial(转载)
原文链接:https://gist.github.com/karenyyng/f19ff75c60f18b4b8149#table-of-content Table Of Content Skip t ...
- 【GO】一个容易踩坑的内外变量屏蔽问题
package main import ( "errors" "fmt" ) func et()(string,error){ return "&qu ...
- C语言 俄罗斯方块的实现1 全局变量
目录 全局变量 程序的模块化之MVC 关于俄罗斯方块的代码实现要点 使用数组表示背景和方块 方块表示及其初始化 要让游戏动起来 方块自动下落 全局变量 简而言之,定义在函数外的变量,就是全局变量. 所 ...
- Zuul网关跨域问题
1.跨域就指着协议,域名,端口不一致,出于安全考虑,跨域的资源之间是无法交互的.简单说就是协议不通,域名不通,端口不同都会产生跨域问题 Access-Control-Allow-Origin是HTML ...
- Known Notation括号匹配类问题(2014年ACM/ICPC 亚洲区域赛牡丹江)
题意: 给你数字或 * 的串,你可以交换一个*和数字.在最前面添1.在一个地方插入*,问你使串满足入栈出栈的(RNP)运算法则. 思路: 引用:https://blog.csdn.net/u01158 ...
- 了解MyISAM与InnoDB的索引差异(转)
出处原文: 1分钟了解MyISAM与InnoDB的索引差异 数据库的索引分为主键索引(Primary Inkex)与普通索引(Secondary Index).InnoDB和MyISAM是怎么利用B+ ...
- SpringBoot上传文件,经过spingCloud-Zuul,中文文件名乱码解决办法
最近用springCloud整合springboot做分布式服务发现经过zuul之后上传的中文文件名乱码全都变成?????,从而引发异常,单独用springboot却是好的,在网上找到相关资料总结如下 ...
- css背景图自适应全屏显示
前几天我在写一个前端页面的时候,需要用到全屏背景图,但是怎么写都不行(要么不全屏,要么不兼容Bootstrap的响应式布局).对,是我腊鸡 后来我在网上找的时候找到一个大神写的笔记,参(照)考(抄)之 ...
- Angular获取dom元素,以及父子组建之间相互传值
1.使用原生js代码获取dom元素 在ts文件中有一个ngOnInit()的方法,这个方式是指在模块加载完毕之后并不是dom加载完毕,也就是说如果你的dom元素中使用的angular的指令,然后想在这 ...