Django ORM的QuerySet:解锁数据库交互的魔法钥匙

在这里插入图片描述
用到此篇文章知识的几篇文章:

  • Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
  • Django API开发实战:前后端分离、Restful风格与DRF序列化器详解

文章目录

  • 前言
  • 一、什么是QuerySet?
  • 二、QuerySet 的用途
  • 三、如何使用 QuerySet?
  • 四、QuerySet 的原理


前言

    在Django的广阔世界里,ORM(对象关系映射)是连接数据库与Python代码的桥梁。而在这座桥梁上,QuerySet无疑是最耀眼的明星。它不仅简化了复杂的数据库操作,还提供了丰富的查询和过滤功能,使得开发者能够轻松地在数据库与应用程序之间穿梭。本文将带你领略QuerySet的魅力,解析其概念、用途、原理,并附上实用的使用方法,让你在Django的开发之路上更加游刃有余。


一、什么是QuerySet?

QuerySet 是 Django 提供的一个高级接口,用于对数据库中的数据进行查询和操作。它是一个包含一系列数据库查询指令的集合,而不是实际的数据行。
QuerySet 对象是惰性的(lazy),这意味着它们不会立即执行查询,直到你真正需要结果时才会执行。

二、QuerySet 的用途

  1. 查询数据:可以对数据库中的记录进行筛选、排序、聚合等操作。
  2. 数据聚合:使用 aggregate 方法进行数据的统计和计算。
  3. 数据注释:使用 select_relatedprefetch_related 优化数据库查询,减少查询次数。
  4. 切片和迭代:可以对 QuerySet 进行切片,获取特定范围的结果,也可以迭代 QuerySet 获取所有结果。
  5. 链式调用QuerySet 方法返回 QuerySet 对象,支持链式调用,使得查询构建清晰且易于阅读。

三、如何使用 QuerySet?

1. 基本查询

entries = Entry.objects.all()  # 获取所有记录

2. 筛选

entries = Entry.objects.filter(published_date__lte=timezone.now())

3. 排除

entries = Entry.objects.exclude(is_draft=True)

4. 排序

entries = Entry.objects.order_by('published_date')

5. 聚合

from django.db.models import Count
entries = Entry.objects.values('author').annotate(total=Count('id'))

6. 切片

first_five_entries = Entry.objects.all()[:5]  # 获取前五条记录

7. 迭代

for entry in Entry.objects.all():print(entry.title)

8. 链式调用

entries = Entry.objects.filter(is_published=True).order_by('-date_published')

四、QuerySet 的原理

QuerySet 的工作原理基于生成器模式当你创建一个 QuerySet 时,Django 会构建一个查询,但不会立即执行它只有当你需要 QuerySet 的数据时,Django 才会执行查询。这有几个关键点:

  1. 惰性执行QuerySet 直到真正需要数据时才执行查询,这可以避免不必要的数据库访问。
  2. 查询优化:Django 会在内部优化查询,比如合并多个查询为一个,减少数据库的访问次数。
  3. 数据库抽象QuerySet 允许开发者以一种数据库无关的方式来编写数据库查询,Django 会将这些查询转换成适合底层数据库的 SQL。
  4. 缓存:Django 可以对 QuerySet 结果进行缓存,以提高性能。

QuerySet 是 Django ORM 的强大工具,它使得数据库操作变得简单、直观且高效。通过 QuerySet,开发者可以轻松地构建复杂的数据库查询,同时保持代码的清晰和可维护性。


对QuerySet进行手动处理:

# 序列化
#query_set<[object, obj2]>
book_set = Book.objects.all()books = []
#  遍历 每一个 模型对象
for book in book_set:books.append({'id': book.id,'btitle': book.btitle,'price': book.price,'bread': book.bread,'bcomment': book.bcomment})

反序列化:django将前端传递的json格式的字符串数据接收并转换为模型对象,这个过程称之为反序列化。

对获取的json数据,手动进行反序列化:

#获取前端传递数据
json_dict = request.data
json_dict = {"btitle":"光年""price":18.8,"bread":20,"bcomment":200
}# 模型对象,将获取的json格式数据插入
obj = Book()
obj.btitle = json_dict['btitle']
obj.price = json_dict['price']
obj.bread = json_dict['bread']
obj.bcomment = json_dict['bcomment']
ojb.save()

在这里插入图片描述

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

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

相关文章

Latex详细教程——图片、表格、公式

一、图片 1、占地一栏普通图片 使用figure环境&#xff0c;[thpb]表示希望在文中占地的优先级&#xff0c;[t] ~ top&#xff0c;顶部&#xff1b;[h] ~ here&#xff0c;当前位置&#xff1b;[p] ~ page of its own&#xff0c;浮动页&#xff1b;[b] ~ bottom&#xff0c;底…

Dell服务器根据GPU温度调整风扇转速

前言 dell服务器自动风扇是根据CPU温度来调速的&#xff0c;我跑AI的时候cpu温度不高但是GPU温度很高导致显卡卡死PVE虚拟机直接挂起无法运行&#xff0c;我看了下也没有基于显卡温度调速的脚本&#xff0c;于是我就自己写了一个 基于ipmi工具 乌班图等linux先安装ipmi apt …

GPT-4o:人工智能新贵的崭露头角

近日&#xff0c;OpenAI 推出了 GPT-4o&#xff0c;这一新一代的人工智能技术引起了广泛的关注和讨论。本文将对 GPT-4o 进行评价&#xff0c;包括与之前版本的对比分析、技术能力以及个人整体感受等方面。 1. 版本间的对比分析 GPT-4o 是 GPT 系列的最新版本&#xff0c;相较…

搭建vauditdemo靶场mysql为NO问题

一、问题 在搭建vauditdemo时&#xff0c;遇到如下显示问题&#xff1a; mysql版本检测为NO 二、解决 查找该方面问题时&#xff0c;并没有找到解决方法 然后换mysql版本换了五六个也没有解决问题 问了AI后给的答复有一条为将mysql改为mysqli 修改保存后解决问题 步骤如…

二分【1】二分查找框架 查找指定元素

目录 二分查找 基本思想 几种情况汇总 一。严格递增序列 1.查找本身 2.查找第一个大于等于自己的 3.查找第一个大于自己的 4.严格递减序列 二。有重复元素 1.取其中第一个出现的 2.取其中最后一个出现的 二分查找 基本思想 几种情况汇总 一。严格递增序列 1.查找本身…

QT 使用opencv 打开usb相机

1.在.pro文件中 添加opencv的头文件与lib 库 INCLUDEPATH D:\opencv\build\install\include LIBS D:\opencv\build\install\x64\mingw\lib\libopencv_*.a LIBS D:\opencv\build\install\x64\mingw\bin\libopencv_*.dll 2. usb相机类的头文件usbCamera.h #ifndef USBCAM…

QNX Hypervisor详细介绍

标签: QNX Hypervisor; Hypervisor; QNX Hypervisor是当前主流的满足车规级的虚拟机产品,这方面高通和QNX高度绑定,“QQ”(Qualcomm+QNX)组合在智能座舱领域占比高达90%以上。 什么是QNX Hypervisor? QNX Hypervisor是由BlackBerry旗下的QNX软件系统公司开发的一种虚…

作业-day-240607

思维导图 C编程 要求&#xff1a; 搭建一个货币的场景&#xff0c;创建一个名为 RMB 的类&#xff0c;该类具有整型私有成员变量 yuan&#xff08;元&#xff09;、jiao&#xff08;角&#xff09;和 fen&#xff08;分&#xff09;&#xff0c;并且具有以下功能&#xff1a;…

模板显式、隐式实例化和(偏)特化、具体化的详细分析

最近看了<The C Programing Language>看到了模板的特化&#xff0c;突然想起来<C Primer>上说的显式具体化、隐式具体化、特化、偏特化、具体化等概念弄得头晕脑胀&#xff0c;我在网上了找了好多帖子&#xff0c;才把概念给理清楚。 看着这么多叫法&#xff0c;其…

上位机图像处理和嵌入式模块部署(f407 mcu vs h750)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在目前工业控制上面&#xff0c;f103和f407是用的最多的两种stm32 mcu。前者频率低一点&#xff0c;功能少一点&#xff0c;一般用在低端的嵌入式设…

【DevOps】路由与路由器详细介绍:原理、功能、类型及应用场景

目录 一、路由详细介绍 1、什么是路由&#xff1f; 2、路由的基本原理 3、 路由协议 静态路由 动态路由 4、 路由表 5、 路由算法 6、路由的优缺点 优点 缺点 7、 路由应用场景 二、路由器详细介绍 1、什么是路由器&#xff1f; 2、 路由器的工作原理 3、路由器…

软考初级网络管理员_02_计算机系统基础知识(硬件)单选题

1.计算机系统中采用()技术执行程序指令时&#xff0c;多条指令执行过程的不同阶段可以同时进行处理。 流水线 云计算 大数据 面向对象 2.当硬盘出现坏道或坏块是&#xff0c;使用哪种方式重构? 全盘重构 局部重构 恢复重构 本地重构 3.传输二进制信号需要()的带宽。…

C语言详解(文件操作)1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

通过在idea上搭建虚拟hadoop环境使用MapReduce做词频去重

idea上的MapReduce ​ 一般在开发中&#xff0c;若是等到环境搭配好了再进行测试或者统计数据&#xff0c;数据处理等操作&#xff0c;那会很耽误时间&#xff0c;所以一般都是2头跑&#xff0c;1波人去在客户机上搭建环境&#xff0c;1波人通过在idea上搭建虚拟hadoop环境&am…

【Python Cookbook】S02E08 编写多行模式的正则表达式

目录 问题解决方案讨论 问题 我们打算使用正则表达式对一段文本做匹配&#xff0c;但是希望在进行匹配时能够跨越多行。换句话说&#xff0c;正则表达式中 . 可以匹配任意除了换行符的字符&#xff0c;我们如何让他也能够匹配换行符&#xff1f; 解决方案 例如在如下的两个案…

React+TS前台项目实战(五)-- 全局常用组件Link封装+使用Omit定义类型

文章目录 前言Link组件1. 功能分析2. 代码注释说明3. 使用方式 总结 前言 接下来的几篇文章&#xff0c;将主要封装全局常用组件&#xff0c;以便于后续编写页面的简易和维护性的提高。本文将主要讲述跳转组件的封装。 Link组件 1. 功能分析 &#xff08;1&#xff09;国际化…

java期末细节知识整理(三)

1.一个类是多个对象的共性体现 2.一个类可以有多个修饰符 3.类是将数据和方法封装在一起的一种数据结构 4.类和对象是面向对象程序设计方法中最核心的概念 5.在三目运算符flag&#xff1f;x1&#xff1a;x2中&#xff0c;如果x1和x2中有一个是浮点数&#xff0c;那么返回值…

Vue3父组件如何访问子组件属性和方法

本篇内容主要是父组件如何访问子组件的属性和方法 文章目录 子组件 //son.vue代码const list (info) >{console.log(info) }const name ref("XXXX")//子组件向父组件暴露了一个方法&#xff0c;然后父组件就可以去使用子组件里面的一些属性和方法了 //子组件向…

JAVA Mongodb 深入学习(二)索引的创建和优化

一、常用索引类型 1、单个索引 单个索引的创建 db.你的表名.createIndex({"你的字段名":1}) 单个索引的创建且是唯一索引 db.你的表名.createIndex({"你的字段名":1}),{ unique: true }) 2、复合索引 将多个过滤的字段&#xff0c;做成索引&#xff0c;…

centos使用docker快速安装nginx

1.使用yum install命令安装nginx,如果不是安装最新版&#xff0c;需指定需要安装的版本号 2.随便启动一个nginx 实例&#xff0c;只是为了复制出配置 docker run -p 80:80 --name nginx -d nginx:1.10 3.将容器内的配置文件拷贝到当前目录,别忘了后面的点&#xff1a; docker…