Django中get()与filter()的区别及常见错误

 更新时间:2025年11月02日 15:02:27   作者:言之。  
Django中get()和filter()是数据查询的核心方法,本文就来介绍一下Django中get()与filter()的区别及常见错误,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

1. 核心区别

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

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(),除非你能绝对保证查询条件的唯一性和存在性。

到此这篇关于Django中get()与filter()的区别及常见错误的文章就介绍到这了,更多相关Django中get()与filter()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 设置xlabel,ylabel 坐标轴字体大小,字体类型

    python 设置xlabel,ylabel 坐标轴字体大小,字体类型

    这篇文章主要介绍了python 设置xlabel,ylabel 坐标轴字体大小,字体类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python selenium爬虫实现定时任务过程解析

    Python selenium爬虫实现定时任务过程解析

    这篇文章主要介绍了Python selenium爬虫实现定时任务过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • pytorch torch运算操作示例详解

    pytorch torch运算操作示例详解

    这篇文章主要介绍了pytorch torch运算的相关知识,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • Django 拼接两个queryset 或是两个不可以相加的对象实例

    Django 拼接两个queryset 或是两个不可以相加的对象实例

    这篇文章主要介绍了Django 拼接两个queryset 或是两个不可以相加的对象实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • python3使用GUI统计代码量

    python3使用GUI统计代码量

    这篇文章主要为大家详细介绍了python3使用GUI统计代码量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • python画图——实现在图上标注上具体数值的方法

    python画图——实现在图上标注上具体数值的方法

    今天小编就为大家分享一篇python画图——实现在图上标注上具体数值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python如何设置Excel单元格边框

    Python如何设置Excel单元格边框

    在数据驱动的业务场景中,自动化设置Excel单元格边框成为提升数据处理效率的关键环节,下面我们就来讲讲如何使用Python设置Excel工作簿中单元格的边框吧
    2025-04-04
  • 安装ElasticSearch搜索工具并配置Python驱动的方法

    安装ElasticSearch搜索工具并配置Python驱动的方法

    这篇文章主要介绍了安装ElasticSearch搜索工具并配置Python驱动的方法,文中还介绍了其与Kibana数据显示客户端的配合使用,需要的朋友可以参考下
    2015-12-12
  • Python递归函数返回值为None问题及解决

    Python递归函数返回值为None问题及解决

    文章主要讨论了在Python中使用递归函数时可能出现的问题,特别是递归函数的返回值不符合预期的情况,文章通过一个具体的例子说明了这个问题,并解释了如何通过在递归调用时加上return语句来解决这个问题
    2024-11-11
  • Python使用Ollama API的详细代码示例

    Python使用Ollama API的详细代码示例

    这篇文章主要介绍了如何在Python中使用OllamaAPI,涵盖了从环境准备、使用方法到高级功能的全面指南,无论是初学者还是经验丰富的开发者都能从中受益,需要的朋友可以参考下
    2025-02-02

最新评论