聚合查询 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. Zabbix-(二) 使用docker部署

    Zabbix-(二)使用docker部署 一.前言 前文记录了在服务器上搭建zabbix平台,本文记录使用docker部署zabbix 4.4 准备 Centos7.6 虚拟机,并安装了docker ...

  2. HALCON数据类型和C#对应数据类型的对比

    摘要:HALCON数据类型:Iconic Variables(图形变量).Control Variables(控制变量).在C#中,图形变量用HObject声明,控制变量用HTuple声明.(halc ...

  3. JavaWeb学习——web.xml文件说明

    JavaWeb学习——web.xml文件说明 摘要:本文主要学习了web.xml文件的作用以及如果配置. 是什么 web.xml文件是用来在JavaWeb项目里面初始化配置信息的,比如:访问的首页.S ...

  4. JS---DOM---自定义属性引入和移除

    总结:在html标签中添加的自定义属性, 如果想要获取这个属性的值, 需要使用getAttribute("自定义属性的名字")才能获取这个属性的值 html标签中有没有什么自带的属 ...

  5. Android 8.1 SystemUI虚拟导航键加载流程解析

    需求 基于MTK 8.1平台定制导航栏部分,在左边增加音量减,右边增加音量加 思路 需求开始做之前,一定要研读SystemUI Navigation模块的代码流程!!!不要直接去网上copy别人改的需 ...

  6. 入职小白随笔之Android四大组件——内容提供器详解(Content Provider)

    Content Provider 内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间 实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的 ...

  7. 数据存储与访问之——SharedPreferences

    使用SharedPreferences(保存用户偏好参数)保存数据, 当我们的应用想要保存用户的一些偏好参数,比如是否自动登陆,是否记住账号密码,是否在Wifi下才能 联网等相关信息,如果使用数据库的 ...

  8. solo升级以及自动化更新的方法

    使用solo过程总涉及到更新问题,所以就在这里把solo更新的方法总结一下.希望能给小伙伴们一些帮助.如何选择更新方法主要是跟你的部署方式有关,如果你是通过 docker方式进行部署,那么你可以还可以 ...

  9. 关于SQL2005备份和还原的语法操作

    原数据库:restore database 练习版 from disk='D:\db-recovery\@@@.BAK' WITH REPLACE/WITH NORECOVERY备份数据库:backu ...

  10. openstack Glance安装与配置

    一.实验目的: 1.理解glance镜像服务在OpenStack框架中的作用 2.掌握glance服务安装的基本方法 3.掌握glance的配置基本方法 二.实验步骤: 1.在controller节点 ...