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,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的 ...
随机推荐
- IE11兼容IE8的设置
我们在使用ie11浏览器的时候,有些网站的兼容性不是太好,这个时候就要设置下ie11的兼容性了.那么ie11浏览器怎么设置兼容IE8呢?下面就让小编给大家介绍一下吧. 首先我们打开电脑里面的ie11浏 ...
- 【Python开发】Python之re模块 —— 正则表达式操作
Python之re模块 -- 正则表达式操作 这个模块提供了与 Perl 相似l的正则表达式匹配操作.Unicode字符串也同样适用. 正则表达式使用反斜杠" \ "来代表特殊形式 ...
- 数据库 ----jdbc连接池的弊端
jdbc连接池的弊端 1.数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能.设想:使用数据库连接池管理数据库连接.2.将sql语句硬编码到 ...
- 天勤考研数据结构笔记—栈的C语言实现
栈的基本概念 栈的定义:栈是一种只能在一端进行插入或删除操作的线性表.其中允许进行插入或删除的一端称为栈顶(top).栈顶是由一个称为栈顶指针的位置指示器(其实就是一个变量,对于顺序栈,就是数组索引, ...
- [python] 进度条效果
method 1 如果出现多行显示,添加选项 tqdm(iter,ncols=40) """ ncols : int, optional The width of the ...
- Java基础(五)
方法概述 方法的定义格式 什么是方法?方法就好像是一个工厂. 如奶牛场 原料:奶牛,饲料 产出物:牛奶,各种奶制品 程序当中的方法 参数(原料):进入方法的数据 返回值(产出物):从方法中出来的数据 ...
- python 运算和流程控制
写在之前 今天突发奇想,想要弄一个微信自动抢红包的程序,首先去百度这个,找到了有两种方法 一种是安装「pocoui」这个第三方库,但没有给出详细代,我就没有使用这个方法. 我用使用的是第二种借助「Ai ...
- java不同包中protected修饰的属性和方法调用方法
protected修饰的静态属性和方法的调用方式1:直接类名调用 2:实例化父类对象进行调用 3:实例化子类对象进行调用 protected修饰的非静态属性和方法的调用方式:1:实例化子类对象进行调用 ...
- 数据库oracle一些操作(MiTAC)
oracle计算时间差函数: 两个Date类型字段:START_DATE,END_DATE,计算这两个日期的时间差(分别以天,小时,分钟,秒,毫秒): 天: ROUND(TO_NUMBER(END_D ...
- 异常-finally关键字的特点及作用
package cn.itcast_07; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...