当前位置: 首页 > news >正文

Django中get()与filter()对比

在 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.dtcms.com/a/283762.html

相关文章:

  • 3D材质总监的“光影魔法”:用Substance Sampler AI,“擦除”照片中的光影
  • 3D Gaussian Splatting (3DGS) 从入门到精通:安装、训练与常见问题全解析
  • 如何构建一个基于大模型的实时对话3D数字人?
  • 【代码随想录】+ leetcode hot100:栈与队列算法专题总结、单调栈
  • 【leetcode】852. 山脉数组的封顶索引
  • MySQL数据库主从复制
  • 如何将 ONLYOFFICE 文档集成到使用 Laravel 框架编写的 PHP 网络应用程序中
  • 7.事务操作
  • 第2章通用的高并发架构设计——2.6 高并发写场景方案1:数据分片之数据库分库分表
  • win10 安装mysql启动
  • 配置mysql
  • ONLYOFFICE Docs 9.0 重磅上线:全面升级界面体验,AI 驱动高效办公
  • Java全栈工程师面试实录:从电商支付到AI大模型架构的深度技术挑战
  • 下载了docker但是VirtualBox突然启动不了了
  • [IRF/Stack]华为/新华三交换机堆叠配置
  • 安装wsl-Ubuntu到D盘
  • 虚拟化测试工具Parasoft Virtualize如何为汽车企业提供仿真测试?
  • php主流框架FastAdmin框架详解以及如何查看版本号和初始安装fastadmin框架-优雅草卓伊凡|大东家
  • Java并发编程第三篇(深入解析Synchronized)
  • Python reduce函数和lambda表达式完全指南 | 函数式编程教程
  • Day04_C语言网络编程20250716_sql语言大全
  • API 接口开发与接入实践:自动化采集淘宝商品数据
  • 基于单片机公交车报站系统/报站器
  • 国产化PDF处理控件Spire.PDF教程:使用 Python 向 PDF 添加文字(支持创建与编辑)
  • 腾讯位置商业授权鸿蒙地图SDK工程配置
  • 网络爬虫的详细知识点
  • 【JVM】深入理解 JVM 类加载器
  • 语雀编辑器内双击回车插入当前时间js脚本
  • Webpack5 新特性与详细配置指南
  • 爬虫小知识