Python QuerySet怎么查数据?Python QuerySet常用方法

在 Python 中,QuerySetDjango 框架中用于与数据库交互的核心对象,它代表从数据库中查询出来的一组记录(对象集合),并提供了丰富的方法来过滤、排序、聚合数据。

以下是关于 Django QuerySet 的全面指南:

新版:python爬取同*顺问财查询数据
加载中
新版:python爬取同*顺问财查询数据

什么是 QuerySet?

  • 惰性加载(Lazy Evaluation):创建 QuerySet 时不会立即执行数据库查询,只有在真正需要数据时(如迭代、切片、调用 len()list())才会执行 SQL 查询。
  • 可链式调用:大多数查询方法返回新的 QuerySet,因此可以链式调用。
  • 缓存机制:一旦 QuerySet 被评估(即执行了查询),结果会被缓存,避免重复查询。

基本用法

假设有一个模型 Author

from myapp.models import Author
# 获取所有作者
all_authors = Author.objects.all()
# 获取单个作者
author = Author.objects.get(id=1)
# 获取满足条件的作者
young_authors = Author.objects.filter(age__lt=30)

常用查询方法

✅ 过滤(Filtering)

# 精确匹配
authors = Author.objects.filter(name="Alice")
# 不等于
authors = Author.objects.exclude(name="Alice")
# 范围查询
authors = Autho

Python QuerySet怎么查数据?Python QuerySet常用方法

r.objects.filter(age__gte=18, age__lte=65) # 包含(模糊匹配) authors = Author.objects.filter(name__contains="Ali") # 以...开头 / 以... authors = Author.objects.filter(name__startswith="A") authors = Author.objects.filter(name__endswith="e") # 正则表达式 import re authors = Author.objects.filter(name__regex=r'^[A-Z]')

✅ 排序(Ordering)

# 升序
authors = Author.objects.order_by('name')
# 降序
authors = Author.objects.order_by('-name')
# 多字段排序
authors = Author.objects.order_by('name', '-age')

✅ 分页(Limiting)

# 前5条记录
first_five = Author.objects.all()[:5]
# 跳过前10条,取接下来5条
page2 = Author.objects.all()[10:15]

⚠️ 注意:对 QuerySet 进行切片会限制查询结果,但不会返回 QuerySet(而是列表)。

✅ 聚合与统计

from django.db.models import Count, Avg, Max, Min, Sum
# 统计作者总数
total = Author.objects.count()
# 平均年龄
avg_age = Author.objects.aggregate(Avg('age'))['age__avg']
# 每个出版社的作者数量
from django.db.models import Count
pubs = Publisher.objects.annotate(num_authors=Count('author'))

✅ 连接查询(Join)

# 获取写过书且书名包含 "Python" 的作者
authors = Author.objects.filter(book__title__contains="Python")
# 去重
authors = Author.objects.filter(book__title__contains="Python").distinct()

Python QuerySet怎么查数据?Python QuerySet常用方法


高级特性

✅ 选择特定字段(Select Only Fields)

减少数据传输量:

authors = Author.objects.values('name', 'email')
# 返回字典列表:[{'name': 'Alice', 'email': 'alice@example.com'}, ...]

✅ 排除特定字段

authors = Author.objects.exclude('password_hash')

✅ 使用 deferonly

延迟加载某些字段(节省内存):

# 只加载 name 和 email,其他字段延迟加载
authors = Author.objects.only('name', 'email')
# 排除加载 bio 字段
authors = Author.objects.defer('bio')

✅ 使用 select_relatedprefetch_related 优化查询

避免 N+1 查询问题:

# 一对一或外键关系,使用 select_related
authors = Author.objects.select_related('publisher').all()
# 多对多或反向外键,使用 prefetch_related
books = Book.objects.prefetch_related('authors').all()

常见陷阱

Python QuerySet怎么查数据?Python QuerySet常用方法

问题 说明
未评估的 QuerySet 创建后未使用,不会执行 SQL,可能导致逻辑错误
重复查询 多次调用 len() 或迭代会重新查询,建议使用缓存或 list()
N+1 查询 在循环中访问关联对象会导致多次数据库查询,使用 select_relatedprefetch_related
内存溢出 对大量数据使用 .all().values() 可能导致内存不足,建议使用分页或迭代器

示例:完整查询流程

from myapp.models import Author, Book
from django.db.models import Count
# 1. 获取所有写过至少一本书的作者
authors = Author.objects.filter(book__isnull=False).distinct()
# 2. 按书名数量排序
authors = authors.annotate(book_count=Count('book')).order_by('-book_count')
# 3. 只获取姓名和邮箱
authors = authors.values('name', 'email')
# 4. 评估查询(执行 SQL)
result = list(authors)
print(result)

调试查询

在开发环境中,可以查看生成的 SQL:

print(Author.objects.filter(name="Alice").query)

或使用 Django Debug Toolbar 查看每次请求的 SQL 执行情况。

首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/483513.html

(0)
服务器主机到底有啥用?服务器主机有哪些作用
上一篇 2026年7月11日 21:57
Python getpeername怎么用?获取客户端IP和端口号
下一篇 2026年7月11日 22:01

相关推荐

  • 个人网站html代码怎么写?免费个人网站模板源码

    个人网站HTML代码并非复杂的编程任务,掌握基础结构后,通过简单的文本编辑即可搭建出符合现代审美且利于搜索引擎收录的静态页面,对于许多希望建立个人品牌、展示作品集或记录生活的初学者而言,直接复制粘贴现成的模板往往导致网站加载缓慢、代码冗余且难以维护,真正的高排名网站,其核心在于代码的纯净度与语义化的精准运用,H……

    2026年5月25日
    16600
  • 服务器怎么命令强制关闭?强制关闭服务器的命令有哪些

    在服务器运维管理中,通过命令行界面(CLI)对进程或服务进行强制关闭,是解决系统假死、资源占用过高或服务无响应最直接、最有效的手段,核心结论在于:优先使用精准的进程终止命令(如 kill -9),其次是服务管理命令(如 systemctl stop),最后才是系统级的重启或关机指令,操作时必须严格核对进程ID……

    2026年3月20日
    8500
  • 个人怎么挑选虚拟主机?虚拟主机和云服务器怎么选

    挑选虚拟主机的核心在于平衡性能、稳定性与性价比,建议优先选择国内备案支持良好、SSD硬盘存储且提供24小时技术支持的主机服务商,而非单纯追求最低价格,对于个人站长或初创项目而言,虚拟主机往往是上线的第一步,很多人误以为主机只是存放代码的空间,实际上它决定了网站的加载速度、安全性以及后期的扩展潜力,选错主机,不仅……

    2026年6月2日
    3200
  • 个人云端存储空间怎么选?免费无限容量网盘推荐

    个人云端存储空间的核心价值在于打破设备物理限制,实现多端数据实时同步与高效管理,选择时需重点考量隐私安全、同步速度及长期存储成本,为什么我们需要个人云端存储空间解决设备存储焦虑智能手机和电脑的配置迭代速度极快,但物理存储容量往往成为瓶颈,当你拍完一段4K视频,或者整理多年的高清照片库时,本地存储空间瞬间告急的焦……

    2026年6月17日
    2400
  • 服务器怎么修改root密码?Linux系统root密码修改步骤详解

    修改服务器root密码是保障系统安全的核心操作,必须通过正规命令行流程完成,避免直接修改系统文件导致损坏,最安全且通用的方法是在登录状态下使用passwd命令,若忘记密码则需进入单用户模式或救援模式重置,操作前务必确认拥有合法权限,并做好数据备份,防止因误操作导致服务中断,常规场景:已知旧密码的修改流程当服务器……

    2026年3月22日
    12600
  • 服务器必会指令有哪些?服务器常用指令大全

    掌握核心服务器指令是保障系统稳定性、安全性和高效运维的基石,也是区分初级管理员与资深架构师的关键分水岭,对于运维人员而言,熟练运用服务器必会指令,不仅能够快速定位系统瓶颈,更能在故障发生的黄金时间内实现业务恢复,核心结论在于:服务器管理的本质是对资源(CPU、内存、磁盘、网络)的精准调度与监控,而指令行工具则是……

    2026年3月23日
    10900
  • 高级威胁检测系统秒杀活动是真的吗?高级威胁检测系统哪里买最便宜

    面对2026年勒索软件即服务(RaaS)与AI自适应攻击的泛滥,部署具备毫秒级响应与图计算溯源的高级威胁检测系统秒杀能力,是企业斩断攻击链、实现零信任防守的唯一定量解,2026攻防博弈:为何传统防线全面失效威胁演进的降维打击当前网络对抗已进入“机器速度”时代,根据国家计算机网络应急技术处理协调中心2026年一季……

    2026年4月26日
    5700
  • 个人旅游视频网站模板怎么做?个人旅游视频网站模板下载

    创作者构建垂直领域IP的最佳载体,它能通过高度定制化的视觉叙事提升用户停留时长,并有效规避第三方平台的算法限制,在2026年的数字内容生态中,单纯的图文游记已难以满足用户对沉浸式体验的需求,视频成为了信息传递的核心介质,而拥有独立的个人旅游视频网站,意味着你掌握了流量分发的主动权,这不仅仅是一个展示窗口,更是个……

    2026年5月29日
    3700
  • 如何自己搭建云服务器?完整配置教程分享

    服务器架设心得服务器架设绝非简单的硬件堆砌与系统安装,它是构建稳定、高效、安全数字基石的工程实践,多年的运维与架构设计经历让我深刻体会到:成功的服务器部署,核心在于前瞻规划、严谨实施与持续优化的闭环,以下是我提炼的核心心得与专业解决方案: 硬件选型:性能、冗余与成本的精妙平衡精准评估需求是基石:明确核心负载类型……

    服务器运维 2026年2月15日
    14500
  • 高端运维云计算是什么?云计算运维薪资待遇如何

    2026年企业级高端运维云计算的核心价值,在于通过AIOps智能驱动与混合多云架构的深度融合,实现业务99.995%以上的极致高可用与IT运维成本的精准优化,2026高端运维云计算的核心演进逻辑从自动化走向认知智能的运维跃迁传统运维依赖人工经验与脚本堆砌,而高端运维云计算在2026年已全面跨入认知智能(Cogn……

    2026年4月29日
    5500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注