Django
中间件:概述
中间件:自定义
Celery(一)
内置应用的作用
内置中间件的作用
Celery(二)
模型 class Meta
模型 管理器(Manager)
related_name 介绍
prefetch_related 介绍
本文档使用 MrDoc 发布
-
+
首页
prefetch_related 介绍
`prefetch_related` 是 Django ORM 提供的一种查询优化工具,主要用于预加载与主对象存在多值关系(如多对多、反向外键或一对多)的关联对象,从而避免在遍历对象时发生 N+1 查询问题。下面详细介绍其原理、使用场景以及示例。 ### 使用示例 假设有如下模型,在这个例子中,一个作者对应多本书,我们希望在查询作者时同时预加载书籍数据: ``` from django.db import models class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): title = models.CharField(max_length=100) # 一个作者可以有多本书,反向关系为 books author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="books") # 查询所有作者,并预取他们关联的书籍,避免每个作者单独查询数据库 authors = Author.objects.prefetch_related("books").all() for author in authors: print(f"作者: {author.name}") for book in author.books.all(): print(f" 书名: {book.title}") # 只预取标题包含 "Python" 关键字的书籍 authors = Author.objects.prefetch_related( Prefetch("books", queryset=Book.objects.filter(title__icontains="Python")) ) for author in authors: print(f"作者: {author.name}") for book in author.books.all(): print(f" 书名: {book.title}") ``` ### 总结 - 主要作用:通过预加载减少数据库查询次数,解决 N+1 查询问题; - 使用场景:适用于多对多、反向外键及一对多等多值关系的优化; - 与`select_related`对比:`select_related` 使用 JOIN 适合单值关联;而 prefetch_related 适合多值关联,通过额外查询和 Python 层合并实现数据关联; 合理使用 prefetch_related 可以显著提升 Django 应用在处理复杂关联关系时的查询性能。希望以上介绍能帮助你更好地理解和使用 prefetch_related。
gaojian
2025年2月19日 14:14
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码