跳到主要内容
知仓学习社ZHICANG

django-orm-query-optimization

Optimize Django ORM query loading by fixing N+1 queries, duplicate related-object queries, over-fetching, serializer/template query loops, and inapp…

不碰外部(只输出文字)无严重或高危命中hashgraph-online/awesome-codex-plugins

它会碰到什么

扫了多少2 个文本文件,5 KB
它会碰到什么不碰外部(只输出文字)
命中总数0 处
命中统计严重 0 · 高 0 · 中 0 · 低 0

这一栏是扫描器报的事实,不是结论。命中多不等于有毒(安全工具、规则库、示例脚本本来就会包含危险写法),命中少也不等于干净。它和你手上的凭据、文件、网络有什么关系,需要你自己看。

技能内容

Django ORM Query Optimization

Use this skill for query-count and object-loading problems. The usual target is an N+1 pattern where each rendered row or serialized object triggers more database work.

Workflow

  1. Prove the query pattern.
  • Capture query count and duplicate SQL for the slow path.
  • Identify the loop, serializer field, template access, admin display, or model property triggering related queries.
  1. Choose the loading strategy.
  • Use select_related() for single-valued relationships: ForeignKey and OneToOneField.
  • Use prefetch_related() for many-valued relationships: reverse FK and many-to-many.
  • Use Prefetch() when the related queryset needs filters, ordering, annotations, or nested select_related().
  • Use values() or values_list() when model instances are unnecessary.
  • Use only() or defer() only when large columns are truly unused.
  1. Keep access consistent.
  • If you prefetch items, do not later call items.filter(...) and expect the prefetch cache to help.
  • If using iterator() with prefetch_related(), provide chunk_size.
  • Avoid putting broad prefetches into default managers unless every caller needs them.
  1. Add a focused regression check when useful.
  • Use a query-count assertion around the exact view or serializer path.
  • Avoid brittle global query-count tests.

See [relationship-and-column-loading.md](references/relationship-and-column-loading.md) for examples and review cues.

Anti-Patterns

  • Adding prefetch_related() to every queryset without checking memory.
  • Using only() and then touching deferred fields in a loop.
  • Optimizing a queryset but leaving serializer method fields to issue per-row queries.
  • Hiding queries in __str__(), model properties, template includes, or admin list methods.

Verification

Show the query count and duplicate-query pattern before and after, plus any wall-time or memory change.

想直接用这个技能?

本站把开放许可(MIT / Apache 等)的技能按仓库打包整理到网盘,点一下转存到你自己的网盘,不用一个个从 GitHub 拉。许可未声明的技能只给原始仓库链接,不打包。