Django08-1:模型层(ORM)--聚合查询/分组查询/F与Q查询/开启事务/常用字段及参数/自定义字段/数据库查询优化

聚合查询

单独使用时,用aggregate

1.只要是跟数据库相关的模块

      基本都在django.db.models里面

       如果没有应该在django.db里面

2. 聚合查询通常配合分组使用


from django.db.models import Avg, Sum, Max, Min, Count# 1.所有书的平均价格
res=models.Book.objects.aggregate('price')ret = models.Book.objects.all().aggregate(price_avg=Avg("price"), price_max=Max("price"), price_min=Min("price"))

 

分组查询

annotate

models后面点什么,就是什么分组

# 1.查询每一本书的作者个数
ret = models.Book.objects.all().annotate(author_num=Count("author")).values('title','author_num')
print(ret)#author_num 自定义字段,用来统计每本书个数。#等价
ret = models.Book.objects.all().annotate(author_num=Count("author__pk")).values('title','author_num')
print(ret)

只要结果是queryset对象,就可以继续.filter()和.values()

#2.统计每个出版社的最便宜书的价格
res=models.Publish.objects.annote(min_price=Min('book__price')).values('name','min_price')#3. 统计不止一个作者的图书#a.先分组书籍,求每一步书籍的作者个数#b. 过滤不止一个作者的书籍
res=models.Book.objects.annote(author_num=Count('authors')).filter(author_num__gt=1).value('title','author_num')
#4. 查询每个作者出的书的总价格
res=models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')

扩展,其他分组方式

models.Book.values('price').annotate()

分组报错情况:去掉严格模式

 

F与Q查询

F功能:直接获取表中某个字段对应的数据

操作字符时,F不能直接做到字符拼接,

否则变成空白

# 1.查询卖出数大于库存书的书籍# F查询
from django.db.models import Fres=models.Book.objects.filter(maichu__gt=F('kuncun'))# 2.将所有书的价格提升50
models.Book.objects.update(price=F('price')+50)# 3.将所有书的名字后面加“爆款”两个字
#***操作字符时,F不能直接做到字符拼接
#***否则变成空白#需要导入两个模块
from django.db.models.functions import Concat
from django.db.models import Valuemodels.Book.objects.update(title=Concat(F('tittle'),Value('爆款')))

Q功能:能改变多个查询条件的关系,与或非

# Q 查询# 1.查询卖出数大于100 或者价格小于600的书籍res= models.Books.objects.filter(maichu__gt=100,price__lt=600)
#错误,filter内是and关系from django.db.models import Qres= models.Books.objects.filter(Q(maichu__gt=100),Q(price__lt=600)) #还是and关系res= models.Books.objects.filter(Q(maichu__gt=100)|Q(price__lt=600)) #Q可以用 |res= models.Books.objects.filter(~Q(maichu__gt=100)|Q(price__lt=600)) #前面取反# Q高阶用法 能够将查询条件左边变成字符串形式q=Q()
q.connector='or' #**修改关系
q.children.append('maichu__gt',180)
q.children.append('price__lt',600)res= models.Books.objects.filter(q) #filter 也支持直接放q对象,默认还是and关系

 

开启事务

事务ACID

事务回滚

事务确认

 

from django.db import transactiontry:with transaction.atomic():  #开始事务操作# 先创建一个出版社new_publisher = models.Publisher.objects.create(name="火星出版社")# 创建一本书models.Book.objects.create(title="橘子物语",price=11.11,kucun=10,maichu=10,publisher_id=1000  # 指定一个不存在的出版社id)except Exception as e:print(str(e))

 

orm中常用字段及参数

AutoField
int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。CharField  (sql:varchar)
字符类型,必须提供max_length参数, max_length表示字符长度。#****所有字段都有verbose_name 字段注释*****IntegerField
一个整数类型,范围在 -2147483648 to 2147483647。BigIntegerFieldDecimalField(Field)- 10进制小数- 参数:max_digits,小数总长度decimal_places,小数位长度EmailField(CharField):  varchar(254)- 字符串类型,Django Admin以及ModelForm中提供验证机制DateField
日期字段,日期格式  YYYY-MM-DD,相当于Python中的datetime.date()实例。DateTimeField
日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。auto_now:每次操作数据的时候,该字段会自动将当前时间更新auto_now_add:创建数据的时候会自动将当前时间记录下来,之后只要不是人为修改,那么一直不变BooleanField(Field)- 布尔值类型数据库存0、1TextField(Field)- 文本类型没有字数限制FileField(Field) -字符- 字符串,路径保存在数据库,文件上传到指定目录- 参数:upload_to = ""      上传文件的保存路径storage = None      存储组件,默django.core.files.storage.FileSystemStorage例如:upload_to = "/data" 会自动将文件保存/data目录下,然后将文件路径保存到数据库        ###外键字段
#django版本不同,级联可能需要手动设置

自定义字段

首先参考常用的字段

                
# 自定义char类型class MyCharField(models.Field):"""自定义的char类型的字段类"""def __init__(self, max_length, *args, **kwargs): # max_length指定字符串宽度self.max_length = max_lengthsuper(MyCharField, self).__init__(max_length=max_length, *args, **kwargs)def db_type(self, connection):"""限定生成数据库表的字段类型为char,长度为max_length指定的值"""return 'char(%s)' % self.max_length  # 返回 'char(32)' 在数据库中就是char类型宽度32  # char类型字段的使用       class Class(models.Model):id = models.AutoField(primary_key=True)title = models.CharField(max_length=25)# 使用自定义的char类型的字段cname = MyCharField(max_length=25)

 

数据库查询优化

ORM语句的特点

惰性查询:只写orm语句,没有使用,orm不会查询数据库。

 

defer 和 only

res=models.Book.objects.all()
print(res) # 要用数据库才查找数据库#获取书籍表中所有的书的名字
res=models.Book.objects.values('title')##only
#获取对象,只有title,没有其他字段。
res=models.Book.objects.only('title')for i in res:print(i.title) #only 括号内的字段,不会走数据库print(i.price) #only 括号外的字段,重新走数据库 all()不需要走数据库#defer
res=models.Book.objects.defer('title')
for i in res:print(i.price)  #defer与only 刚好相反。括号内走数据库,括号外不需要找数据库。

 

select_related 与prefetch_related

与跨表操作有关

res=models.Book.objects.all()
for i in res:print(i.publish.name) #每循环一次就走一次数据库res=models.Book.objects.select_related('publish') #inner join
#select_related内部直接将book与pulish连接起来,然后一次性将大表里的所有数据
#全部封装给查询出来的对象
# 这时候无论.book表数据还是publish数据都无需要走数据查询# select_related括号内只能放外键字段 一对多,一对一
#多对多不行for i in res:print(i.publish.name)#连多表select_related('a__b__c')###prefetch_relatedres=models.Book.objects.prefetch_related('publish')# prefetch_related 实际是子查询
# 子查询的结果分装到对象中
# 用户感觉不出多一个命令for i in res:print(i.publish.name)#联表查询,遇到大表,效率就慢。

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记事本状态栏不会自动_如何在记事本中同时启用状态栏和自动换行

记事本状态栏不会自动The status bar in Windows’ Notepad displays the current line number and column number of the cursor location. However, if you find that the Status Bar option on the View menu is grayed out, it may be because you have Word Wrap enabled…

极端高温导致澳大利亚断网

西澳大利亚首府珀斯因恶劣天气出现了网络连接问题, 网络故障不是由于暴风雨或闪电引起的,而是极端高温。本周一是珀斯有记录以来第六热的天,当天最高温度达到了44.4℃。因为创纪录的高温,澳大利亚宽带 服务商iiNet在当…

推荐一款采用 .NET 编写的 反编译到源码工具 Reko

今天给大家介绍的是一款名叫Reko的开源反编译工具,该工具采用C#开发,广大研究人员可利用Reko来对机器码进行反编译处理。我们知道.NET 7 有了NativeAOT 的支持,采用NativeAOT 编译的.NET程序 无法通过ILSpy 之类的传统工具得到源码&#xff0…

并行传输数据和串行传输数据_为什么串行数据传输比并行数据传输快?

并行传输数据和串行传输数据SATA hard drive connections are faster than older PATA hard drive connections and the same can be said for external cabling standards, but this is counter-intuitive: why wouldn’t the parallel transmission be faster? SATA硬盘驱动…

微软让卡塔尔世界杯踏入元宇宙

遵守前一篇公众号文章里的承诺,昨天盆盆在视频号里录制了一段5分钟左右的短视频,讲了江森自控和微软Azure,如何帮助卡塔尔世界杯打造基于元宇宙的数字体育馆。Part.1欢迎扫码关注我的视频号(每天更新元宇宙、云计算和数字化的短视频)。Part.2…

插槽1单通道插槽2双通道_相机双存储卡插槽有什么大不了的?

插槽1单通道插槽2双通道If you paid any attention to the launch of Canon and Nikon’s first full frame mirrorless cameras—the EOS R, Z6, and Z7— you’d have noticed that some people were pretty unhappy that they only came with a single card slot—an SD slo…

python 垃圾回收详解

原文:https://zhuanlan.zhihu.com/p/31150408 总纲策略和垃圾回收系统工作内容引用计数详解标记-清除分代收集循环引用编程应用-常见方法ex 过程详解使用建议触发机制参考文献Python垃圾回收机制--完美讲解(Python vs Ruby)Python垃圾回收机制…

mac 不能连接wi-fi_如何阻止Mac自动连接到Wi-Fi网络

mac 不能连接wi-fiYour Mac automatically reconnects to Wi-Fi networks you’ve previously connected to. Starting with macOS High Sierra, you can now tell your Mac not to automatically connect to certain Wi-FI networks. Your Mac will remember the Wi-Fi networ…

罗汉塔最少步骤_如何以最少的步骤压缩和密码保护文件?

罗汉塔最少步骤If you have a large batch of files to compress and you want to add password protection to each of them, what is the simplest or quickest way to do so? Today’s SuperUser Q&A post has the answer to a curious reader’s question. 如果要压缩…

IoTSharp中使用X509加密MQTT通讯并实现设备鉴权

IoTSharp支持MQTT协议通过 TLS 1.2 加密通讯, 并可以通过X509证书进行设备认证登录。基本配置在 appsettings.Production.json中需要 指定域名, 并设置EnableTls为true"MqttBroker":{"DomainName":"http://demo.iotsharp.net:2…

django12:form 组件/渲染标签/数据校验/钩子函数/

基本用法 from django import forms# 自己写一个类 class RegForm(forms.Form):username forms.CharField(min_length3,max_length8, label"用户名")password forms.CharField(min_length3,max_length8,label"密码")emailforms.EmailField() 1.校验数据为…

如何快速拥有一个 Web IDE

本文将介绍如何使用 2-3 句指令在几分钟内创建一个 Web IDE 环境。服务器准备如何准备服务器可以参考上文 一键体验 Istio,这里只需要一台即可,示例中的服务器 IP 为:43.154.189.116安装 Web IDE下载安装工具在服务器上,执行以下指…

有了防火墙、IPS、WAF 还需要数据库审计?

本文讲的是 有了防火墙、IPS、WAF 还需要数据库审计?,“我们的网络安全系统中已经有了Web应用防火墙、网络防火墙和IPS,难道还需要数据库审计吗?”很多人有这样的疑问,网络中有层层防护,还不能保护数据库的…

20155339 Exp4 恶意代码分析

20155339 Exp4 恶意代码分析 实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么。请设计下你想监控的操作有哪些,用什么方法来监控。 监控网络连接。当某个…

Linux就该这么学---第七章(LVM逻辑卷管理器)

第七章节-LVM技术逻辑卷管理器(LVM,Logical Volume Manager)1.物理卷(PV,physical Volumn)2.卷组(VG,Volume Group)3.逻辑卷(LV,Logical Volume)基本单元[PE,Physical Extent] 物理卷处于LVM中的最底层,可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列卷组建立在…

从Windows XP升级? 这是您需要了解的Windows 7

With Windows XP reaching the end of its long support life, many businesses and individuals are avoiding Windows 8 and upgrading to Windows 7 instead. If you’re a latecomer to Windows 7, here are the basics you need to know. 随着Windows XP使用寿命的延长&am…

Java迭代器原理

1迭代器模式 迭代器是一种设计模式,这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 一般实现方式如下:(来自) public interface Iterator {public boolean hasNext();public Object next(); } pu…

企业版Java EE正式易主 甲骨文再次放手

有人说甲骨文收购的东西大多没有了好下场,这么说虽然有些片面,但是最近一个月Java EE和Solaris的境遇难免让人产生类似的联想。 继笔者上次报道《甲骨文将放弃Java EE 开源基金会双手欢迎》之后,最新消息显示,原本在甲骨文手中的J…

js中各种位置

js中各种位置 js中有各种与位置相关的属性,每次看到的时候都各种懵逼。索性一次总结一下。 clientHeight 内容可视区域的高度。包括padding不包括border、水平滚动条、margin。对于inline的元素这个属性一直是0,单位px,只读元素。offsetHeight offsetHei…

如何判断您是否拥有32位或64位版本的Google Chrome浏览器

Google Chrome is extremely popular with our readers, but did you know that they also have a 64-bit version of the browser these days? Here’s how to tell which version you are running, and how to switch if you aren’t. 谷歌浏览器在我们的读者中非常受欢迎&a…