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. 开发者必备Linux命令

    开发者必备Linux常用命令,掌握这些命令绝对够了,基于CenterOS7.6. 系统服务管理 systemctl 输出系统中各个服务的状态: systemctl list-units --type= ...

  2. 剑指offer:二叉树打印成多行(层次遍历)

    1. 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 2. 思路 层次遍历 3. 递归 public class Solution { ArrayList<Array ...

  3. Srinath总结 架构师们遵循的 30 条设计原则

    作者:Srinath 翻译:贺卓凡,来源:公众号 ImportSource Srinath 通过不懈的努力最终总结出了 30 条架构原则,他主张架构师的角色应该由开发团队本身去扮演,而不是专门有个架构 ...

  4. linux (centos)增删改查用户命令

    1,查看用户 cat /etc/passwd 2,删除用户 userdel 用户名 3,查看组 cat /etc/group 4,删除组 groupdel 组名 5.查看系统中有哪些用户: cut - ...

  5. linq,创建数据库,插入数据,newDB.CreateDatabase();newDB.tb2.InsertOnSubmit(stu); newDB.SubmitChanges();

    using System.Data.Linq;using System.Data.Linq.Mapping; namespace ConsoleApplication1388{ class Progr ...

  6. Vert.x HTTP 服务器与客户端

    编写HTTP 服务器与客户端 Vert.x让编写非阻塞的HTTP 服务器与客户端变得非常轻松. 创建HTTP 服务器 缺省状况: HttpServer server = vertx.createHtt ...

  7. Mysql 报错:#1067 - Invalid default value for 'update_time

    由于 字段UPDATE_TIME 的字段类型是 timestamp ,默认值是:'0000-00-00 00:00:00' 即:`UPDATE_TIME` timestamp NOT NULL DEF ...

  8. 十:装饰器模式(io流)

    定义:装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.                  这一个解释,引自百度百科,我们 ...

  9. CSS box-sizing属性的正确用法

    CSS自定义属性(变量) CSS box-sizing属性允许我们在元素的总宽度和高度中包含填充和边框. 没有CSS box-sizing属性 默认情况下,元素的宽度和高度计算如下: width + ...

  10. Qt程序app添加图标复制到其它电脑后不显示的解决方法

    原因: 主是要因为Qt显示图标需要依赖一些库来进行转换,而复制到其它电脑后不显示,是没有复制相应的库所致,所以把相应库复制过去就行了. 复制Qt的plugins目录下的imageformats文件到程 ...