Imported from hashgraph-online/awesome-codex-plugins (
plugins/LVTD-LLC/skills/skills/django-orm-query-optimization/SKILL.md). Install upstream withnpx skills add hashgraph-online/awesome-codex-plugins --skill django-orm-query-optimization. Copyright stays with the author (MIT).
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
-
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.
-
Choose the loading strategy.
- Use
select_related()for single-valued relationships:ForeignKeyandOneToOneField. - Use
prefetch_related()for many-valued relationships: reverse FK and many-to-many. - Use
Prefetch()when the related queryset needs filters, ordering, annotations, or nestedselect_related(). - Use
values()orvalues_list()when model instances are unnecessary. - Use
only()ordefer()only when large columns are truly unused.
- Use
-
Keep access consistent.
- If you prefetch
items, do not later callitems.filter(...)and expect the prefetch cache to help. - If using
iterator()withprefetch_related(), providechunk_size. - Avoid putting broad prefetches into default managers unless every caller needs them.
- If you prefetch
-
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.