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. git相关2

    初学备忘: git安装好后,目录右键 => Git Bash here _________________________ 初始化仓库 git init 仓库名 配置仓库 git config ...

  2. Ajax常用例子 Post 和 Get

    1. 前台:Post$.ajax({ url: "@Url.Action("Save", "UserFun")", type: " ...

  3. 有缓存区的管道channel

    package main import ( "fmt" "time" ) func main() { //创建一个有缓存区的管道 ch := make(chan ...

  4. C 函数与指针(function & pointer)

    C 函数与指针(function & pointer) /* * function.c * 函数在C中的使用 * */ #include <stdio.h> int noswap( ...

  5. 9.Go-反射、日志和线程休眠

    9.1反射 在Go语言标准库中reflect包提供了运行时反射,程序运行过程中动态操作结构体 当变量存储结构体属性名称,想要对结构体这个属性赋值或查看时,就可以使用反射 反射还可以用作判断变量类型 整 ...

  6. matlab练习程序(DBSCAN)

    DBSCAN全称Density-Based Spatial Clustering of Applications with Noise,是一种密度聚类算法. 和Kmeans相比,不需要事先知道数据的类 ...

  7. MySQL实战45讲学习笔记:第三十七讲

    一.本节概况 今天是大年初二,在开始我们今天的学习之前,我要先和你道一声春节快乐! 在第 16和第 34篇文章中,我分别和你介绍了 sort buffer.内存临时表和 join buffer.这三个 ...

  8. Elastic 使用索引生命周期管理实现热温冷架构

    Elastic: 使用索引生命周期管理实现热温冷架构 索引生命周期管理 (ILM) 是在 Elasticsearch 6.6(公测版)首次引入并在 6.7 版正式推出的一项功能.ILM 是 Elast ...

  9. Linux查看日志常用命令(转载)

    转自: https://www.cnblogs.com/kbkiss/p/7567725.html -------------------------------------------------- ...

  10. CentOS6 + MapServer7.4编译

    先升级gcc 1.python3.6 ./configure --enable-shared --enable-profiling make –j 20 make install 2.proj-4.9 ...