python主流框架Django:ORM框架关联查询与管理器
-
目录
注意 使用前要调用之前的模型类
F对象
Q对象
聚合函数
排序
关联查询(连表查询)
修改
删除
查询集 QuerySet
注意 使用前要调用之前的模型类
-
F对象
之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用 "F对象",被定义在django.db.models中。
-
基本语法
F(属性名)
-
基本使用
# 查询阅读量大于等于评论量的图书。
from django.db.models import F BookInfo.objects.filter(bread__gte=F('bcomment'))# 可以在F对象上使用算数运算。
# 查询阅读量大于2倍评论量的图书。
BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
-
-
Q对象
-
Q对象介绍
-
1. 多个过滤器逐个调用表示逻辑"与"关系,同sql语句中where部分的and关键字。
2. 如果需要实现逻辑 "或(or)" 的查询,需要使用 Q对象 结合 "|" 运算符,Q对象被义在django.db.models中。
-
基本语法
Q(属性名__运算符=值)
Q对象可以使用"&"、"|" 连接,"&" 表示逻辑与,"|" 表示逻辑或。
Q对象前可以使用 "~" 操作符,表示非(not)。
-
基本使用
# 查询阅读量大于20,并且编号小于3的图书。
BookInfo.objects.filter(bread__gt=20,id__lt=3)# 或者
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3) # 查询阅读量大于20的图书,改写为Q对象如下。
from django.db.models import Q BookInfo.objects.filter(Q(bread__gt=20))# 查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))# 查询编号不等于3的图书。
BookInfo.objects.filter(~Q(pk=3))
-
-
聚合函数
-
聚合函数介绍
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中。
-
基本语法
模型类.objects.aggregate(聚合函数())
aggregate的返回值是一个字典类型,格式如下:
{'属性名__聚合类小写':值} 如: {'bread__sum':3} -
基本使用
# 查询图书的总阅读量
from django.db.models import Sum BookInfo.objects.aggregate(Sum('bread'))# 使用count时一般不使用aggregate()过滤器。
# count函数的返回值是一个数字
# 查询图书总数。
BookInfo.objects.count()
-
-
排序
# 使用order_by对结果进行排序, 默认按主键排序
BookInfo.objects.all().order_by() # 默认排序,这里是按id排序
BookInfo.objects.all().order_by('bread') # 升序BookInfo.objects.all().order_by('-bread') # 降序 -
关联查询(连表查询)
-
简单关联查询
-
由一到多
# 由一到多的访问语法: 一对应的模型类对象.多对应的模型类名小写_set
# 相当于添加了一个隐式属性
b = BookInfo.objects.get(id=1) b.heroinfo_set.all() -
由多到一
# 由多到一的访问语法: 多对应的模型类对象.多对应的模型类中的关系类属性名
# 实际生成的数据表外键字段名为hbook_id
h = HeroInfo.objects.get(id=1) h.hbook# 访问一对应的模型类关联对象的id语法: 多对应的模型类对象.关联类属性_id
# 多对应的模型类对象.关联类属性_id 是在模型迁移时自动生成的一个字段
h = HeroInfo.objects.get(id=1) h.hbook_id
-
-
关联过滤查询
-
主动连表查询
HeroInfo.objects.filter(id__lte=3).select_related("hbook").values("id","hbook__btitle") # <QuerySet [{'id': 1, 'hbook__btitle': '射雕英雄传'}, {'id': 2, 'hbook__btitle': '射雕英雄传'}, {'id': 3, 'hbook__btitle': '射雕英雄传'}]> -
由多模型类条件查询一模型类数据
# 理解:多模型根据属性找到一模型,再通过外键定位一模型
# 语法:关联模型类名小写__属性名__条件运算符=值; 如果没有"__运算符"部分,表示等于。
# 查询图书,要求图书英雄为"孙悟空"
BookInfo.objects.filter(heroinfo__hname='孙悟空')# 查询图书,要求图书中英雄的描述包含"八"
BookInfo.objects.filter(heroinfo__hcomment__contains='八') -
由一模型类条件查询多模型类数据
# 理解:一模型根据条件定位一个或多个一模型对象,再通过多模型类的关联字段筛选出所有多模型对象
# 语法: 多模型类关联一模型的属性名__一模型类属性名__条件运算符=值,如果没有"__运算符"部分,表示等于。
# 查询书名为“天龙八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle='天龙八部')# 查询图书阅读量大于30的所有英雄
HeroInfo.objects.filter(hbook__bread__gt=30)
-
-
-
修改
-
修改说明
修改更新的两种方法:
方式一: save; 修改模型类对象的属性 => 执行save()方法
方式二: update; 使用模型类.objects.filter().update()直接修改, 会返回受影响的行数
-
代码示例
# 方式一 (操作单个对象)
hero = HeroInfo.objects.get(hname='猪八戒') hero.hname = '猪悟能' hero.save()# 方式二 (操作集合)
HeroInfo.objects.filter(hname='沙悟净').update(hname='沙僧')
-
-
删除
-
删除说明
删除的两种方法:
方式一: 调用模型对象的delete方法; 模型类对象.delete()
方式二: 调用模型对象集合的delete方法; 模型类.objects.filter().delete()
-
代码示例
# 方式一 (操作单个对象)
hero = HeroInfo.objects.get(id=13) hero.delete()# 方式二 (操作集合)
HeroInfo.objects.filter(id=14).delete()
-
-
查询集
QuerySet-
查询集的基本介绍
-
基本概念
查询集,也称查询结果集-QuerySet,表示从数据库中获取的对象集合。当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
- all():返回所有数据。
- filter():返回满足条件的数据。
- exclude():返回满足条件之外的数据。
- order_by():对结果进行排序。
-
对查询集可以再次调用过滤器进行过滤,如:
BookInfo.objects.filter(bread__gt=30).order_by('bpub_date')
# 也就意味着查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果。从SQL的角度讲,查询集与select语句等价,过滤器像where、limit、order by子句。
-
判断某一个查询集中是否有数据:
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
-
-
查询集的两大特征
-
1) 惰性执行
-
说明
创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用
-
代码示例
# 当执行如下语句时,并未进行数据库查询,只是创建了一个查询集 qs
qs = BookInfo.objects.all()# 继续执行遍历迭代操作后,才真正的进行了数据库的查询
for book in qs:print(book.btitle)
-
-
2)缓存
-
说明
使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。
-
代码案例一
# 如下是两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载。
from books.models import BookInfo [book.id for book in BookInfo.objects.all()] [book.id for book in BookInfo.objects.all()] -
代码案例二
# 经过存储后,可以重用查询集,第二次使用缓存中的数据
qs=BookInfo.objects.all() [book.id for book in qs] [book.id for book in qs]
-
-
-
限制查询集
-
说明
可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。注意:不支持负数索引。
对查询集进行切片后返回一个新的查询集,不会立即执行查询。如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()如果没有数据引发DoesNotExist异常
-
代码示例
# 立即查询
qs = BookInfo.objects.all()[0]# 生成查询集,不会立刻查询
qs = BookInfo.objects.all()[0:2]
-
-
管理器Manager
-
管理器的基本概念
管理器是Django的模型进行数据库操作的接口,Django应用的每个模型类都拥有至少一个管理器。
我们在通过模型类的objects属性提供的方法操作数据库时,即是在使用一个管理器对象objects。当没有为模型类定义管理器时,Django会为每一个模型类生成一个名为objects的管理器,它是models.Manager类的对象。
-
自定义管理器
我们可以自定义管理器,并应用到我们的模型类上。
-- 注意:一旦为模型类指明自定义的管理器后,Django不再生成默认管理对象objects。
-
自定义管理器类主要用于两种情况:
-
情况一: 修改原始查询集,重写all()方法。
-
a)打开
books/models.py文件,定义类BookInfoManager#图书管理器class BookInfoManager(models.Manager):def all(self):# 默认查询未删除的图书信息# 调用父类的成员语法为:super().方法名return super().filter(is_delete=False)-
b)在模型类
BookInfo中定义管理器class BookInfo(models.Model):...books = BookInfoManager() -
c)使用方法
# 修改模型类以后需要重新进入交互环境
BookInfo.books.all()
-
-
情况二: 在管理器类中补充定义新的方法
-
a)打开
booktest/models.py文件,定义方法create。class BookInfoManager(models.Manager):def create_book(self, title, pub_date):# self.model可以获得模型类的实例对象book = self.model()book.btitle = titlebook.bpub_date = pub_datebook.bread=0book.bcommet=0book.is_delete = False# 将数据插入进数据表book.save()return book -
b)为模型类
BookInfo定义管理器books语法如下class BookInfo(models.Model):...books = BookInfoManager() -
c)调用语法如下
from datetime import datebook = BookInfo.books.create_book("大话西游",date(1980,1,1))
-
-
相关文章:
python主流框架Django:ORM框架关联查询与管理器
目录 注意 使用前要调用之前的模型类 F对象 Q对象 聚合函数 排序 关联查询(连表查询) 修改 删除 查询集 QuerySet 注意 使用前要调用之前的模型类 F对象 之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用 "F对象&quo…...
如何有效维护您的WordPress在线商店内容:提高客户参与度与转化率的实用技巧
在电子商务领域,内容为王。新鲜、相关且有吸引力的内容能显著提升客户参与度和转化率。本文将探讨如何有效更新和维护您的在线商店内容,确保客户始终获得最佳体验。 定期更新产品信息 产品描述 产品描述是吸引客户和促成销售的关键。定期检查并更新产…...
【Java】认识异常
1.异常概念与体系结构 1.1异常的概念 在我们日常开发中,代码都是尽可能完善,但是难免会出现一些奇奇怪怪的问题。而这些奇奇怪怪的问题可能很难通过代码去控制,比如格式不对会报错,网络不好也会报错等。 在Java中,将…...
20 Shell Script输入与输出
标出输入、标准输出、错误输出 一、程序的基本三个IO流 一)文件描述符 任何程序在Linux系统中都有3个基本的文件描述符 比如: cd/proc/$$/fd 进入当前shell程序对于内核在文件系统的映射目录中: [rootlocalhost ~]# cd /proc/$$/fd [rootlocalhos…...
HCIP-HarmonyOS Application Developer 习题(十六)
(判断)1、HiLink通过分布式软总线的方式连接所有设备,强能力设备可对弱能力设备进行设备虚拟化,将弱设备当做本机设备直接调用。 答案:错误 分析:HiLink 主要针对的是应用开发者与第三方设备开发者…...
没有什么可以抵达乌托邦,包括AI
本文为《智人之上:从石器时代到AI时代的信息网络简史》书评 可以说,尤瓦尔赫拉利又一次让我们获得了理解人类文明的新视角。 这是他一直以来都在做的:构建理解人类文明史的新知识框架。从此前的《人类简史》《未来简史》《今日简史》,到今天的新书《智人之上》,他一直保…...
家庭事务管理系统|基于java和vue的家庭事务管理系统设计与实现(源码+数据库+文档)
家庭事务管理系统 目录 基于java和vue的家庭事务管理系统 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师,阿里云…...
doris创建异步物化视图(加速数据低频变更的复杂实时计算)
异步物化视图,可以把那些每次实时计算非常耗时的,而需要计算的数据变更比较低频的这些计算创建对应的异步物化视图,当相关数据变化的时候触发异步任务去更新计算结果,或者定时计算也可以。例如该处示范为计算订单的订单标识&#…...
PhpSpreadsheet创建带复杂表头的excel数据
目录 一:背景 二:excel表头数据实现 三:excel渲染数据实现: 四:最终效果如下: 一:背景 最近需要统计一些数据,导出到excel,主要是一些区域的人员销售统计数据,涉及到复杂的表头和…...
BurpSuite渗透工具的简单使用
BurpSuite渗透工具 用Burp Suite修改请求 step1: 安装Burp Suite。官网链接:Burp Suite官网 step2: 设置代理 step3: 如果要拦截https请求,还需要在客户端安装证书 step4: 拦截到请求可以在Proxy ->…...
洞察云上风险,主机安全尽在掌握
在实战攻防演练中,主机一直是攻击方的最终目标。作为网络架构中的重要组成部分,主机包含了大量的敏感数据、关键服务和系统资源。同时主机拥有网络资源的访问权限,攻击者通过入侵主机获得权限,进而控制整个网络或系统。因此做好主…...
使用kimi编辑助手,开始搭建一个微信小程序!第一天
为什么开源?因为不开源,一个人开发小程序,一点突如其来的变故就会导致自己整体处于一个不舒服的状态,同时自己从0开始1开始搭建小程序,也是自己个体之间能力的验证! 目前小程序版本:2.5.2 目前…...
【已解决】libev not found
学习韦东山老师的Linux应用开发实验班的JSON部分,在编译JSON包的过程中 报错命令: ./configure --hostarm-buildroot-linux-gnueabihf -prefix$PWD/tmp 错误信息: checking for libev support... checking for arm-buildroot-linux-gnue…...
qt QVariant详解
QVariant是Qt框架中一个功能强大的变体类,它提供了一种通用的方式来存储Qt对象及其他类的值,能够以类似于指针的方式存储任意类型的值。 一、 主要特性 通用性:QVariant可以存储几乎所有数据类型,包括基本数据类型(如…...
再获殊荣!通付盾当选信息技术应用创新工作委员会技术活动单位称号
近日,通付盾凭借其在信息技术应用创新领域的卓越贡献和突出表现,荣获“信息技术应用创新工作委员会技术活动单位”称号。这一荣誉不仅是对通付盾在技术创新和信息安全领域努力的肯定,更是对其在推动国家信息技术应用创新发展中发挥重要作用的…...
PostgreSQL模板数据库template0和template1的异同点
PostgreSQL模板数据库 PostgreSQL有两个模板数据库:template0和template1,template0是不可修改的,而template1是可以修改的。 那模板数据库有什么作用呢?顾名思义,当做模板。 其实我们创建数据库 CREATE DATABASE 其…...
手机ip切换成全局模式怎么弄
在当今数字化时代,智能手机已成为我们日常生活中不可或缺的一部分,无论是工作、学习还是娱乐,都离不开它的陪伴。随着网络技术的不断发展,手机IP地址的切换技术也逐渐走进大众视野,中,“全局模式” 作为IP切…...
前端学习笔记(1.0)
在开发项目时,需要使用符号来代替书写./和../等麻烦的路径书写,所以就遇到了下面的问题。 输入没有路径提示 我们都知道,设置是通过配置vite等脚手架工具的配置文件,设置别名即可。 但是如果需要在使用的时候需要出现路径提示&…...
推动TMS-EEG数据预处理标准化
摘要 将非侵入性脑刺激(NIBS)技术与脑电生理活动记录相结合是神经科学领域广泛使用的方法。同时结合经颅磁刺激(TMS)与脑电图(EEG)尤其成功。但是,为了有效地与大脑活动进行交互,所需的强磁脉冲不可避免地会在同步EEG采集过程中产生伪影。因此ÿ…...
国产电脑能装win系统吗_国产电脑安装windows要求及方法
国产电脑能装win系统吗?国产电脑可以安装Windows系统,但需要满足特定条件。目前只有CPU基于X86架构国产电脑才可以安装windows。下面小编就和大家一起来分析下国产电脑安装windows要求及方法。 国产电脑能装win系统吗? 答:国产电脑可…...
BVH构建优化:四种分割算法在光线追踪中的性能对比
1. BVH分割算法基础概念 当你在玩3D游戏时,有没有想过为什么场景中的物体能够如此快速地渲染出来?这背后就离不开BVH(边界体积层次结构)技术的支持。简单来说,BVH就像是一个高效的"物体分类系统",…...
Gitee团队协作实战:从零到一掌握项目协同开发流程
1. 为什么选择Gitee进行团队协作开发 作为一个经历过多次团队协作开发的老手,我强烈推荐Gitee作为国内团队的代码托管平台。相比其他平台,Gitee的服务器在国内,访问速度更快,而且完全符合国内开发者的使用习惯。记得我第一次带团队…...
5分钟快速上手LosslessCut:零编码视频剪辑的终极指南
5分钟快速上手LosslessCut:零编码视频剪辑的终极指南 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 你是否曾因视频剪辑导致画质下降而烦恼?是…...
告别重复编码:用快马ai自动生成c语言基础工具模块提升效率
告别重复编码:用快马AI自动生成C语言基础工具模块提升效率 在C语言开发中,我们经常需要重复编写一些基础工具模块,比如安全的字符串输入、动态数组管理、日志记录等功能。这些代码虽然不复杂,但每次都从头开始写确实很浪费时间。…...
Tsunami Arduino硬件抽象库:高精度信号发生与频率测量
1. Tsunami信号发生器与频率计硬件抽象库概述Tsunami 是一款面向嵌入式测试与教学场景的多功能信号发生器与频率计硬件平台,其核心价值在于将高精度模拟信号生成、宽频带数字信号捕获与实时频率测量能力集成于紧凑的单板系统中。本库(tsunami-arduino&am…...
“人工智能+”政策下,企业AI转型的机遇与路径
在“人工智能”政策的大力推动下,企业引入AI项目与产品正成为提升竞争力、实现转型提效的关键举措。对于山东地区,尤其是威海地区的企业而言,把握这一趋势,积极探索AI技术的应用,无疑是顺应时代发展的明智选择。企业引…...
MCP服务器越权访问漏洞零容忍方案(基于Open Policy Agent的动态策略引擎实战)
第一章:MCP服务器越权访问漏洞零容忍方案总览MCP(Microservice Control Plane)服务器作为微服务架构中权限调度与策略执行的核心组件,其任意越权访问均可能导致全链路认证绕过、敏感配置泄露甚至横向渗透。本方案坚持“零容忍”原…...
3步打造个人数据备份系统:QQ空间数字记忆永久保存指南
3步打造个人数据备份系统:QQ空间数字记忆永久保存指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字化时代,个人数据备份已成为保护数字记忆的关键措施。…...
《跨摄像机追踪的终局:镜像视界空间计算方案深度解析》——从“识别与匹配”走向“空间计算与连续存在”的最终形态
跨摄像机追踪的终局:镜像视界空间计算方案深度解析——从“识别与匹配”走向“空间计算与连续存在”的最终形态发布单位:镜像视界(浙江)科技有限公司一、问题终局:跨摄像机追踪到底要解决什么?在过去十年中…...
如何用Open-Sora在5分钟内开启你的AI视频创作之旅
如何用Open-Sora在5分钟内开启你的AI视频创作之旅 【免费下载链接】Open-Sora Open-Sora: Democratizing Efficient Video Production for All 项目地址: https://gitcode.com/GitHub_Trending/op/Open-Sora Open-Sora是一个革命性的开源视频生成项目,它正在…...
