在 Django 中,get()filter() 是 QuerySet API 中用于检索数据的两个核心方法,它们的功能和使用场景有明显区别。以下是详细对比:

1. 核心区别

特性get()filter()
返回值单个对象(模型实例)查询集(QuerySet,可迭代)
数量限制必须精确匹配1个对象可以匹配0个、1个或多个对象
对象不存在时抛出 DoesNotExist 异常返回空查询集(不报错)
多对象匹配时抛出 MultipleObjectsReturned 异常返回包含多个对象的查询集
链式调用不支持(返回的是模型实例)支持(可继续添加过滤条件)

1111

2. 语法与示例

get() 的用法
# 获取 ID 为 1 的书(必须存在且唯一)
book = Book.objects.get(id=1)# 等价的手动异常处理
try:book = Book.objects.get(id=1)
except Book.DoesNotExist:# 处理不存在的情况pass
except Book.MultipleObjectsReturned:# 处理多对象匹配的情况pass
filter() 的用法
# 获取所有已发布的书(可能有0本或多本)
books = Book.objects.filter(status='published')# 链式过滤:获取已发布且价格大于 50 的书
books = Book.objects.filter(status='published').filter(price__gt=50)# 等价的单语句写法
books = Book.objects.filter(status='published', price__gt=50)# 获取第一本书或 None(推荐替代 get() 的安全写法)
first_book = books.first()  # 等价于 books[0] if books else None

3. 性能对比

  • get():直接查询单条记录,生成的 SQL 类似 SELECT ... WHERE ... LIMIT 1,理论上更高效。
  • filter().first():生成的 SQL 是 SELECT ... WHERE ... LIMIT 1,与 get() 几乎相同,但多了一步 Python 对象转换,性能损耗可忽略不计。

注意:在查询条件唯一(如主键查询)时,两者性能接近;但 filter().first() 更安全。

4. 适用场景

推荐使用 get() 的场景
  • 查询条件唯一(如通过主键或唯一键查询)。
  • 对象必须存在,否则视为程序错误(如配置项、固定ID的系统数据)。
  • 示例
    user = User.objects.get(username='admin')  # 管理员用户必须存在
    
推荐使用 filter() 的场景
  • 查询条件不唯一(如按类别筛选商品)。
  • 结果可能为空(如搜索功能)。
  • 需要链式查询(如分页、排序、多条件组合)。
  • 示例
    # 搜索功能(结果可能为空)
    books = Book.objects.filter(title__icontains='python')# 分页查询
    books = Book.objects.filter(category='tech').order_by('-pub_date')[:10]
    

5. 常见错误案例

错误使用 get() 的场景
# 错误:title 可能不唯一,导致 MultipleObjectsReturned
book = Book.objects.get(title="Python")# 正确:使用 filter().first()
book = Book.objects.filter(title="Python").first()
低效的 filter() 使用
# 低效:两次数据库查询
if Book.objects.filter(id=1).exists():book = Book.objects.get(id=1)  # 重复查询# 高效:单次查询
book = Book.objects.filter(id=1).first()

6. 总结

场景方法
通过主键/唯一键获取单个对象get()(需确保存在)
安全获取单个对象(不存在时返回 None)filter().first()
查询可能存在多个结果或空结果filter()
需要链式查询(如分页、排序)filter()

建议:优先使用 filter().first() 替代 get(),除非你能绝对保证查询条件的唯一性和存在性。

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

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

相关文章

MySQL锁(一) 概述与分类

1.1 MySQL锁的由来 客户端发往 MySQL 的一条条 SQL 语句,实际上都可以理解成一个个单独的事务(一条sql语句默认就是一个事务)。而事务是基于数据库连接的,每个数据库连接在 MySQL 中,又会用一条工作线程来维护&#x…

PyTorch里的张量及张量的操作

张量的简介 张量是多重线性映射在给定基下的坐标表示,可视为向量和矩阵的泛化。 0 维张量:标量(如 5)1 维张量:向量(如 [1, 2, 3])2 维张量:矩阵(如 [[1, 2], [3, 4]]&…

向量数据库Faiss vs Qdrant全面对比

Faiss vs Qdrant 全面对比表 向量数据库是一种相对较新的方式,用于与来自不透明机器学习模型(如深度学习架构)派生的抽象数据表示进行交互。这些表示通常被称为向量或嵌入(embeddings),它们是用于训练机器学习模型完成诸如情感分析、语音识别、目标检测等任务的数据的压…

2025年AIR SCI1区TOP,缩减因子分数阶蜣螂优化算法FORDBO,深度解析+性能实测

目录1.摘要2.蜣螂优化算法DBO原理3.改进策略4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流1.摘要 传统DBO存在探索与开发能力失衡、求解精度低以及易陷入局部最优等问题。因此,本文提出了带有缩减因子分数阶蜣螂优化算法(FORDBO&#xff0…

爬虫逆向之JS混淆案例(全国招标公告公示搜索引擎 type__1017逆向)

案例https://ctbpsp.com/#/ 截至2025.07.19可用 定位加密位置 加密位置: 定位方式,XHR,跟栈 跟栈 QL打断点,重新断住 分析为,一个函数传入四个参数 var QL QI[d9(Nv.mQ)](QJ, Qh, Qv, this[d9(Nv.m9)][0xa1a * …

Hive常用命令总结

一、数据库操作 -- 创建数据库(默认路径) CREATE DATABASE IF NOT EXISTS myhive;-- 指定路径创建数据库 CREATE DATABASE myhive2 LOCATION /myhive2;-- 查看数据库信息 DESC DATABASE myhive;-- 删除数据库(强制删除表) DROP DA…

Spring整合MyBatis详解

Spring整合MyBatis详解一、整合优势与核心思路1.1 整合优势1.2 核心整合思路二、环境搭建与依赖配置2.1 开发环境2.2 Maven依赖配置三、整合配置(核心步骤)3.1 数据库配置文件(db.properties)3.2 Spring配置文件(sprin…

Windows CMD(命令提示符)中最常用的命令汇总和实战示例

CMD命令汇总 下面是 Windows CMD(命令提示符)中最常用的命令汇总,共 30 个,包含说明和典型代码示例,适合日常开发、系统操作、文件管理、网络诊断等场景。一、文件与目录操作(最常用)命令说明示…

嵌入式硬件篇---舵机(示波器)

舵机是一种高精度的角度控制执行器件,广泛应用于机器人、航模、自动化设备等领域。其核心特点是能通过控制信号精准定位到特定角度(通常范围为 0-180,部分可到 360 连续旋转)。常见的舵机类型可根据结构、控制方式、用途等维度划分…

嵌入式硬件篇---按键

按键是电子系统中最基础的人机交互部件,通过机械或电子方式实现电路通断或状态切换。根据结构和工作原理的不同,常见按键可分为机械按键、薄膜按键、触摸按键等,以下详细介绍其工作原理、应用场景及电路特点:一、机械按键&#xf…

试用SAP BTP 06:AI服务-Data Attribute Recommendation

创建实例 方法一:BTP主控室-子账户-服务市场 输入实例配置信息,下一步 不用参数,下一步 审核实例,点击创建 实例创建完成后,创建服务键值 输入键值名称,点击 创建 方法二(建议)&…

训诂学中的“形音义互求”对NLP、知识图谱、注意力机制的启示

一、训诂学与现代人工智能结合的学术价值与技术潜力1. ​​训诂学的核心优势与AI语义分析的契合点​​训诂学作为中国传统学术中研究古代文献语义的核心学科,其方法论和理论框架对自然语言处理(NLP)的深层语义分析具有深刻的启发性和技术补充…

http基础一

1. HTTP是什么? HTTP(超文本传输协议,HyperText Transfer Protocol)是一种用于从万维网服务器传输超文本到本地浏览器的协议。它是无状态的客户端-服务器协议,通常在Web浏览器和Web服务器之间用于传输网页、图片、视频…

西门子 S7-1500 系列 PLC CPU 选型全指南:从类型到实战

在西门子 S7-1500 系列 PLC 的系统构建中,CPU 作为核心控制单元,其选型直接决定了自动化系统的性能、功能扩展性和适用场景。本文将系统解析 S7-1500 系列 CPU 的类型划分、核心参数、典型型号功能及选型流程,助你精准匹配工业控制需求。一、…

PaddleOCR 与 PaddleX 调试

PaddleOCR 与 PaddleX 调试1.安装1.1 环境准备1.2用Conda创建虚拟环境2.测试2.1发票测试2.2 手写汉字识别3.PaddleOCR 与 PaddleX 对比3.1 基于 PaddleX 部署 OCR 服务1.安装 PP OCR 文档 1.1 环境准备 根据自己操作系统按网上指导安装 ccache ccache --version是否已安装 …

imx6ull-系统移植篇11——U-Boot 移植(下)

目录 前言 移植过程 添加开发板默认配置文件 添加开发板对应的头文件 添加开发板对应的板级文件夹 修改Makefile 文件 修改imximage.cfg 文件 修改Kconfig 文件 修改MAINTAINERS 文件 修改 U-Boot 图形界面配置文件 编译 uboot LCD 驱动修改 修改源文件 修改头文…

30天打牢数模基础-模拟退火算法讲解

二、完整Python代码 import random import mathdef rastrigin(x, y):"""二维Rastrigin函数(目标函数,需最小化)参数:x: 自变量xy: 自变量y返回:函数值f(x,y)"""return 20 x**2 y**2 …

论文阅读 - FastInst

文章目录1 概述2 模型说明2.1 总体架构2.2 轻量pixel decoder2.3 实例激活引导的Query2.4 双路径更新策略2.5 GT掩码引导学习2.6 损失函数3 效果1 概述 FastInst是一种基于query的实时实例分割方法,它能以32.5FPS的实时速度在COCO测试集上达到40.5的AP。在实例分割…

Elasticsearch 9.x 高可用集群部署教程(3 主节点 + 3 数据节点)

Elasticsearch 9.x 高可用集群部署教程(3 主节点 + 3 数据节点) 1. 集群架构规划 生产环境中的 Elasticsearch 集群需要高可用性和容错能力。以下是基于 3 主节点 + 3 数据节点的架构规划: 节点分布: 主节点(Master Nodes):3 台(master-node-1, master-node-2, maste…

Unity_通过鼠标点击屏幕移动屏幕里的一个对象

文章目录一、获取到点击物体的Tansform(摁下鼠标左键的瞬间)二、移动点击的物体(摁着鼠标左键不放)三、松开左键清理被移动对象属性总结注:本文章只是学习总结的笔记,视频链接 一、获取到点击物体的Tansfor…