Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作

聚合查询

记住用到关键字aggregate然后还有几个常用的聚合函数就好了

from django.db.models import Max,Min,Count,Sum,Avg
#分别是最大、最小、记录个数、求和及平均值 res = models.Book.objects.all().aggregate(Avg('price'))
res1 = models.Book.objects.all().aggregate(Max('price'))
res2 = models.Book.objects.all().aggregate(Min('price'))
res3 = models.Book.objects.all().aggregate(Sum('price'))
res4 = models.Book.objects.all().aggregate(Count('title'))
res5 = models.Book.objects.all().aggregate(Avg('price'),Max('price'),Min('price'),Sum('price'),Count('title'))

分组查询

记住用到关键字annotate然后下面几个例子

#1.统计每一本数的作者个数
res = models.Book.objects.annotate(author_num = Count('authors')).values('author_num')
print(res) #2.统计每个出版社卖出的最便宜的书的价格
res = models.Publish.objects.annotate(price_min=Min('book__price')).values('price_min')
print(res) #3.统计不止一个作者的图书
"""
先统计出每本图书对应的作者个数
再筛选出其中个数大于1的书名
"""
res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('author_num')
print(res)
#4.查询各个作者出的书的总价格
res = models.Author.objects.annotate(sum_price=Count('book__price')).values('sum_price')
print(res)

F与Q查询

有这样一个需求:我们之前在查询数据库的时候条件都是我们自己手写的但是现在出现了条件是从数据库里面获取的

"""
我们在需要在book表中新建两个字段, 分别是 stock(库存)和sale(销售量),这里要注意了,新建字段,要么设置默认值,要么加一个null=True,否则将会报错
""" from django.db.models import F,Q
##F查询 #1.查询出卖出数大于库存数的书籍
models.Book.objects.filter(sale__gt=F('stock')) #2.将所有数的价格 全部提高100块
models.Book.objects.update(price=F('price') + 100) #3.将所有书的名字后面加上 爆款 二字(这里需要用到数据库里面的拼接方法 Concat 同时要跟上拼接值Value)
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(name=Concat(F('name'), Value('爆款'))) ##Q查询 #1.查询科比自传或者价格是1000的书
res = models.Book.objects.filter(Q(title="科比自传")|Q(price=1000)) # |/,/~表示或与非 #2.Q进阶 产生Q对象 然后再使用
q=Q()
q.connector = 'or'
q.children.append(('title__icontains','p'))
q.children.append(('stock',666))
res = models.Book.objects.filter(q)
print(res) #这样查到的就是 书名包含p/P或者是库存是666的书对象 ##惰性查询(必须使用才会给你打印结果要不然就是空) # only方法
res = models.Book.objects.only('title')
for r in res:
# print(r.title) #只有一条SOL语句对应多个查询结果
print(r.price) #有几个结果就有几个查询语句 '''
only会将括号内的字段对应的值 直接封装到返回给你的对象中 点该字段 不需要再走数据库 一旦你点了不是括号内的字段 就会频繁的去走数据库查询
''' # defer方法
res = models.Book.objects.defer('title') # defer和only互为反关系
for r in res:
print(r.title) #有几个值就打印几句sql语句 '''
defer会将括号内的字段排除之外将其他字段对应的值 直接封装到返回给你的对象中 点该其他字段 不需要再走数据库
一旦你点了括号内的字段 就会频繁的去走数据库查询
''' # select_related 方法
res = models.Book.objects.select_related('publish')
for r in res:
print(r.publish.addr)
"""
select_related 会自动帮你做连表操作 然后将连表之后的数据全部查询出来封装给对象(连接查询,只输出一条sql语句) select_related括号内只能放外键字段 并且多对多字段不能放 如果括号内外键字段所关联的表中还有外键字段 还可以继续连表
select_related(外键字段__外键字段__外键字段...)
""" # prefetch_related 方法
res = models.Book.objects.prefetch_related('publish')
print(res)
for r in res:
print(r.publish.name) """
prefetch_related 看似连表操作 其实是类似于子查询(会打印出两个sql语句)
prefetch_related括号内只能放外键字段
并且多对多字段不能放 如果括号内外键字段所关联的表中还有外键字段 还可以继续连表
select_related(外键字段__外键字段__外键字段...)
""" ## select_related和prefetch_related方法的特点
'''
第一个 内部自动连表 消耗的资源就在连表上 但是走数据库的次数较少 第二个 内部不做连表 消耗的资源就在查询次数上 但是给用户的感觉跟连表操作一样
'''

Django中如何开启事务

from django.db import transaction
with transaction.atomic():
# 在该代码块中所写的orm语句 同属于一个事务 # 缩进出来之后自动结束 #例如:
'''
michael给jackson转100元
那么在数据层要做的事 1.创建一条订单数据
2.michael钱减100,jackson钱加100
''' from django.db.models import F
from django.db import transaction
#开启事务处理
try:
with transaction.stomic():
#创建一条订单数据
models.Order.objects.create(num='1110101001', user_id = 1, user_id = 2, count=1) #能执行成功 models.User.objects.filter(id=1).update.(money=F("money")-100) #michael
models.User.objects.filter(id=2).update.(money=F('money')+100) #jackson
except Exception as e:
print(e)

Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作的更多相关文章

  1. Django 聚合分组F与Q查询及choices

    一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...

  2. django----聚合查询 分组 F与Q查询 字段 及其 参数

    目录 一.orm补充查询 聚合查询 1-1 分组查询 1-2 F与Q查询 1-3 二. 字段及其参数 常用字段 AutoField IntegerField CharField DateField D ...

  3. Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)

    Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...

  4. Django 聚合查询 分组查询 F与Q查询

    一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...

  5. 70 多表查询的分组F 聚合 Q 查询

    聚合查询和分组查询 聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典.键的名称是聚合值的标识符,值是计算出来的聚合值.键的名称是按照字段和聚合函 ...

  6. Django中多表的增删改查操作及聚合查询、F、Q查询

    一.创建表 创建四个表:书籍,出版社,作者,作者详细信息 四个表之间关系:书籍和作者多对多,作者和作者详细信息一对一,出版社和书籍一对多 创建一对一的关系:OneToOne("要绑定关系的表 ...

  7. Django ORM 之F、Q查询与事务

    返回ORM目录 Django ORM 内容目录 一.F.Q查询 二.事务 三.only与defer 一.F.Q查询 """ Product表中的数据: 1 橡皮 2 20 ...

  8. django基础之day05,F与Q查询,Q查询的高级用法

    #F与Q查询 #*************************** F 查询 ******************** # F 查询数据库中的其他字段!!! #1.查询库存数大于卖出数的书籍 fr ...

  9. django F与Q查询 事务 only与defer

    F与Q 查询 class Product(models.Model): name = models.CharField(max_length=32) #都是类实例化出来的对象 price = mode ...

随机推荐

  1. ini_set()

    ini_set ( string $varname , string $newvalue ) : string 设置指定配置选项的值.这个选项会在脚本运行时保持新的值,并在脚本结束时恢复. 参数 va ...

  2. VBA基础 - 函数和模块

    概要 对于一般的 VBA 程序来说, 可能一个或几个函数就行了. 毕竟, VBA 只是作为 excel 的辅助工具来用的. 但是, 随着 VBA 写的越来越多, 用个工程来管理就有必要了, 而一个代码 ...

  3. svn merge操作

    使用SVN做Merge操作时,会包含6个选项,下面就这6个选项给出详细的说明: 1.Merge a range of revisions 此类型应用最为广泛,主要是把源分支中的修改合并到目标分支上来. ...

  4. Ubuntu 16.04 + OpenCV 自定义环境变量 pkg-config / PKG_CONFIG_PATH

    0. 前言 今天在执行一段脚本的时候,爆出错误: Package opencv was not found in the pkg-config search path. Perhaps you sho ...

  5. 入门理解mysql-binlog

    mysql-binlog简介: mysql的二进制日志记录了所有DDL和DML(除select) 开启binlog日志后会有1%左右的的性能损耗 二进制日志包括两类 索引文件 XXXX.index 日 ...

  6. torch_13_自定义数据集实战

    1.将图片的路径和标签写入csv文件并实现读取 # 创建一个文件,包含image,存放方式:label pokemeon\\mew\\0001.jpg,0 def load_csv(self,file ...

  7. [DP]Luogu 2014NOIP提高组 飞扬的小鸟题解

    2014NOIP提高组飞扬的小鸟题解 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一 ...

  8. 关于 C# 8.0 的 Switch Case When 的用法

    直接贴代码了: static void Main(string[] args) { SwitchSample(); } private static void SwitchSample() { Swi ...

  9. C# 方法的out、ref、params参数

    一.out参数实例 [实例]求一个数组中的最大值.最小值.总和.平均值 class Program { static void Main(string[] args) { //写一个方法 求一个数组中 ...

  10. JS-21点游戏

    //21点游戏 let readline=require("readline-sync"); //清屏函数 let clear=()=>process.stdout.writ ...