mcpField
D
django-orm-query-optimization

django-orm-query-optimization

github.com/lvtd-llcDevelopment167 installsUpdated 7w ago
Repository

About django-orm-query-optimization

A Django skill for diagnosing and reducing excess database queries, especially N+1 patterns in views and serializers. It guides developers through query inspection, relationship loading choices, and focused regression checks.

Key features

  1. 01Measure query counts and duplicate SQL
  2. 02Choose related-object loading strategies
  3. 03Avoid prefetch and deferred-field pitfalls
  4. 04Add focused query-count regression checks
  5. 05Compare query, time, and memory changes

Use cases

  1. 01Reduce N+1 queries in a serializer
  2. 02Investigate slow templates or admin pages
  3. 03Verify an ORM optimization with a regression check

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/lvtd-llc/skills --skill django-orm-query-optimization

After installing, type/django-orm-query-optimizationin Claude Code to confirm it loaded.

Bundled filesreferences/relationship-and-column-loading.md

Details

From the project README

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.
  2. 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.
  3. 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.
  4. 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 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.

Comments

Markdown supported