聚合查询 aggregate

操作外键字段管理数据的时候,因为外键字段带来的约束,所以会 级联更新、级联删除

举个例子,书与出版社是一对多关系,外键字段在书那儿。这时候把出版社删除,那么对应的书籍也会删除;如果把出版社的主键值改变,那么书籍表中对应的主键值也会自动修改。

聚合函数

聚合函数必须要使用在分组之后

使用如下函数:

Max Min Sum Avg Count

在django中需要使用关键字:

  • aggregate,

  • 需要导入模块:from django.db.models import Max, Min, Sum, Avg, Count

举几个例子演示聚合函数:

# 1.筛选出价格最高的书籍
from django.db.models import Max, Min, Sum, Avg, Count res = models.Book.objects.aggregate(max=Max('price'))
print(res) # 2.求书籍总价格
res = models.Book.objects.aggregate(sum=Sum('price'))
print(res) # 3.求书籍平均价格
res = models.Book.objects.aggregate(avg=Avg('price'))
print(res) # 4.一起使用
res = models.Book.objects.aggregate(Max('price'),Min('price'),Sum('price'),Count('price'),Avg('price'))
print(res)

分组查询 annotate

# 1.统计每一本书的书名 和对应的作者人数
res = models.Book.objects.annotate(author_num=Count('authors__pk')).values('title', 'author_num')
print(res) # 2.统计出每个出版社卖的最便宜的书的价格 出版社的名字 价格
res = models.Publish.objects.annotate(min_price=Min('book__pk')).values('name', 'min_price')
print(res) # 3.统计不止一个作者的图书
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查询

我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较,django提供了F()方法。

举例说明:

  1. 查询卖出数(sold)大于库存(stock)的商品
from django.db.models import Q

res = models.Book.objects.filter(sold__gt=F('stock')).values('title')
print(res)

  1. 将所有书的价格上涨100块
models.Book.objects.all().update(price=F('price') + 100)
  1. 将所有书的名称后面全部加上 "新款" 后缀
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(title=Concat(F('title'), Value('新款')))

操作字符串需要借助Concat 进行拼接操作, 加上拼接值Value

Q查询

filter() 等方法中逗号隔开的条件是and的关系。 如果你需要执行更复杂的查询,如or关系,需要借助Q()

举例说明:

查询一下书籍名称是昆虫记 或者 库存数是500的书籍

from django.db.models import Q

# res = models.Book.objects.filter(Q(title='昆虫记'), Q(stock=500))   # 这样使用逗号还是and关系
res = models.Book.objects.filter(Q(title='昆虫记') | Q(stock=500)) # 使用 | 变成 or关系

Q对象高级用法

from django.db.models import Q

q = Q()
q.connector = 'or' # 默认是and关系,这里指定or关系
q.children.append(('title', '昆虫记')) # 这里是元组
q.children.append(('stock__gt', 500))
res = models.Book.objects.filter(q)
print(res)

这样就可以实现用户输入什么,就能查询什么

ORM操作事务

回忆一下 事务的四大特性:ACID

  • 原子性:事务的操作是一个整体,不可分割,是最小单位
  • 一致性:数据库总是从一个一致性的状态转换到另一个一致性的状态。因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。
  • 隔离性:事务与事务的操作是隔离的
  • 一旦事务提交,则其所做的修改会永久保存到数据库,不可修改

数据库的三大范式

  • 第一范式是最基本的范式,如果数据库表中的所有字段值都是不可分解的原子值,说明就满足的第一范式
  • 第二范式是在第一范式的基础上的,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖主键的一部分。也就是说在一个数据表中,只能保存一种数据,不能把多种数据保存在同一张表中。
  • 第三范式基于第二范式, 确保数据表中每一列数据都和主键直接相关,而不能间接相关。要求一个关系中不包含在其他关系已包含的非主键字段信息。

django中开启事务

from django.db import transaction

with transaction.atomic():
# 在缩进的代码中书写数据库操作
# 该缩进内的所有代码, 都是一个事务
pass # 事务在with外自动结束

django之查询操作及开启事务的更多相关文章

  1. Django Models 查询操作

    1.准备数据表: from django.db import models class City(models.Model): name=models.CharField(max_length=32) ...

  2. django模型查询操作

    一旦创建好了数据模型,Django就会自动为我们提供一个数据库抽象API,允许创建.检索.更新和删除对象操作 下面的示例都是通过下面参考模型来对模型字段进行操作说明: from django.db i ...

  3. Django orm查询操作

    基于双下划线查询切记!!!!正向查询按字段,反向查询按表名的小写 正向:在Book表里设置关联Obj表,Book------>Obj就是正向查询 反向:在Book表里设置关联Obj表,Obj-- ...

  4. Django ORM 查询操作

    queryset中支持链式操作 book=Book.objects.all().order_by('-nid').first() 只要返回的是queryset对象就可以调用其他的方法,直到返回的是对象 ...

  5. ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化

    聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...

  6. Django的orm操作之表查询二

    复习 单表查询 # 单表操作 # 增 # 方式1 user_obj=models.User.objects.create(**kwargs) # 之一create # 方式2 user_obj=mod ...

  7. Oracle database link中查询会开启事务吗?

    关于oracle database link,使用database link相关的查询语句是否会开启事务呢?我们知道,在数据库中一个简单的SELECT查询语句不会产生事务(select for upd ...

  8. OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

    公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...

  9. $Django python中使用redis, django中使用(封装了),redis开启事务(管道)

    一 Python操作Redis之普通连接 #先安装 pip3 install redis import redis r = redis.Redis(host='127.0.0.1', port=637 ...

随机推荐

  1. Cocos Creator 资源加载流程剖析【六】——场景切换流程

    这里讨论场景切换的完整流程,从我们调用了loadScene开始切换场景,到场景切换完成背后发生的事情.整个流程可以分为场景加载和场景切换两部分,另外还简单讨论了场景的预加载. 加载场景的流程 load ...

  2. 【zabbix服务】修改zabbix_server默认端口号

    1. zabbix-server的默认端口号是10051.如果存在端口号冲突,需要更改端口号. 2. 更改配置文件 # 监听端口这行默认被注释的(将下面的端口改为自己定义的) [root@tanbao ...

  3. Mysql - 高可用方案之MMM(一)

    一.概述 本文将介绍mysql的MMM(Master-Master replication manager for MySQL)方案.官方文档地址:https://mysql-mmm.org/star ...

  4. C# WinForm界面美化--使用IrisSkin实现换肤功能

    WinForm界面使用IrisSkin,可以说做到了一键美化,当然美化的效果仁者见仁智者见智,可以挑选自己喜欢的. 1.IrisSkin下载地址:https://www.cr173.com/soft/ ...

  5. ES-索引管理

    参考: https://es.xiaoleilu.com/070_Index_Mgmt/00_Intro.html 创建索引 PUT /new_index 创建更多详细设置的索引: 删除索引 DELT ...

  6. GO基础之延时执行

    一.延迟是什么?•即延迟( defer)语句,延迟语句被用于执行一个函数调用,在这个函数之前,延迟语句返回. 一.延迟函数 1.可以在函数中添加多个defer语句.•当函数执行到最后时,这些defer ...

  7. JavaScript 递归遍历json串获取相关数据

    递归遍历json串获取相关数据   by:授客 QQ:1033553122 1.   测试数据 // 导航菜单 [ { id: 1, parentId: 0, parentName: null, na ...

  8. 不能绑定到端口号:9194原因:Cannot assign requested address: JVM_Bind

    晚上将老服务器程序从win2008部署在新的云服务器win2012上,其实就是复制过去改改配置,启动时突然报不能绑定到端口号:9194原因:Cannot assign requested addres ...

  9. 【西北师大-2108Java】第十四次作业成绩汇总

    [西北师大-2108Java]第十四次作业成绩汇总 作业题目 面向对象程序设计(JAVA) 第16周学习指导及要求 实验目的与要求 (1)掌握Java应用程序的打包操作: (2)掌握线程概念: (3) ...

  10. 2019-2020-1 20199305《Linux内核原理与分析》第七周作业

    进程的描述与创建 (一)进程的描述 (1)操作系统内核实现操作系统的三大管理功能(进程管理最为核心) 进程管理 内存管理 文件系统 (2)在Linux内中用一个数据结构struct task_stru ...