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系统吗? 答:国产电脑可…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
