关于 django-orm-query-optimization
面向 Django 开发者的查询优化技能,帮助诊断并减少数据库查询,尤其是视图和序列化器中的 N+1 查询。它涵盖查询检查、关联对象加载策略选择和针对性回归检查。
主要功能
- 01测量查询数量并检查重复 SQL
- 02选择关联对象加载策略
- 03避免预取和延迟字段陷阱
- 04添加针对性的查询数回归检查
- 05比较查询、耗时和内存变化
适用场景
- 01减少序列化器中的 N+1 查询
- 02排查模板或管理页面变慢
- 03通过回归检查验证 ORM 优化
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill django-orm-query-optimization安装后在 Claude Code 中输入/django-orm-query-optimization确认已加载。
附带文件references/relationship-and-column-loading.md
详细介绍
Django ORM 查询优化
将此技能用于查询次数和对象加载问题。常见目标是 N+1 模式:每个渲染的行或序列化对象都会触发额外的数据库操作。
工作流
-
证实查询模式。
- 捕获慢速路径的查询次数和重复 SQL。
- 找出触发关联查询的循环、序列化器字段、模板访问、管理后台显示项或模型属性。
-
选择加载策略。
- 对单值关系使用
select_related():ForeignKey和OneToOneField。 - 对多值关系使用
prefetch_related():反向 FK 和多对多关系。 - 当关联查询集需要筛选、排序、注释或嵌套的
select_related()时,使用Prefetch()。 - 不需要模型实例时,使用
values()或values_list()。 - 仅当确实不会用到大型列时,才使用
only()或defer()。
- 对单值关系使用
-
保持访问方式一致。
- 如果预取了
items,之后不要再调用items.filter(...)并期望预取缓存发挥作用。 - 如果将
iterator()与prefetch_related()一起使用,请提供chunk_size。 - 除非每个调用方都需要,否则不要将范围过广的预取放入默认管理器。
- 如果预取了
-
在有帮助时添加有针对性的回归检查。
- 针对确切的视图或序列化器路径,断言查询次数。
- 避免脆弱的全局查询次数测试。
示例和审查要点请参阅 relationship-and-column-loading.md。
反模式
- 未检查内存使用情况,就给每个查询集添加
prefetch_related()。 - 使用
only()后又在循环中访问延迟加载的字段。 - 优化查询集,却让序列化器方法字段继续逐行发起查询。
- 将查询隐藏在
__str__()、模型属性、模板包含项或管理后台列表方法中。
验证
展示优化前后的查询次数和重复查询模式,以及任何运行时间或内存变化。
评论
支持 Markdown