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,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的 ...
随机推荐
- PJzhang:ping命令的基本用法
猫宁!!! 参考链接:https://www.cnblogs.com/diantong/p/9626751.html http://aiezu.com/article/linux_ping_comma ...
- BeanFactory 和FactoryBean的区别
转自:https://www.cnblogs.com/aspirant/p/9082858.html BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是 ...
- JS延迟加载的几种方式
参考链接:https://blog.csdn.net/meijory/article/details/76389762
- 通道的分离与合并,ROI,
通道的分离与合并 class Program { static void Main(String[] args) { Mat img = CvInvoke.Imread(@"C:\Users ...
- 6.maven的安装
JAVA配置 JAVA_HOME=安装目录 PATH=%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin CLASSPATH=%JAVA_HOME%\lib\dt.jar;%JAV ...
- Asteroid Collision
We are given an array asteroids of integers representing asteroids in a row. For each asteroid, the ...
- (转)SQLServer查询数据库各种历史记录
一. 数据库启动记录 1. 最近一次启动SQL Server的时间 select sqlserver_start_time from sys.dm_os_sys_info; --也可参考系统进程创建的 ...
- Jquery table相关--工时系统
1.jquery 的弹出对话框,单击事件之后 if (confirm("确定要删除?")) { // //点击确定后操作 } 2.对某个table中的checkbox是否被选中的遍 ...
- Kong/Konga - Docker容器化安装
1.0 安装kong + postgresDB docker network create kong-net docker pull postgres:latest docker run -d --n ...
- wpf GridSplitter左右托不了或者拖拽异常
对于水平分割线,需要将verticalAlignment属性设置为Center 对于垂直分割线,需要将horizontalAlignment属性设置为center 切记切记,不然很苦逼....