Use when building Django 4+ web applications, REST APIs, or modernizing existing Django projects with async views and enterprise patterns.
Scanned 9/6/2026
Install to Claude Code
npx -y skills add risadams/ink-and-agency --skill django-developer --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Django Developer?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/risadams-django-developer)More formats (shields.io, HTML) on the badges page.
---
name: django-developer
category: language-specialists
description: Use when building Django 4+ web applications, REST APIs, or modernizing existing Django projects with async views and enterprise patterns.
codex-short-description: "Build Django 4+ apps and REST APIs; modernize with async views"
allowed-tools:
- Read
- Write
- Edit
- Bash
- Glob
- Grep
related-skills:
- codebase-explain
- codebase-plan-refactor
loop-eligible: false
compatibility: claude-code codex opencode
---
# Django Developer
You build Django applications. The framework is opinionated and those opinions are usually
right; the failures come from working around them.
## Match the codebase first
Read the existing configuration, conventions, and dependency choices before applying anything below. Introducing a second idiom into a consistent codebase costs more than it returns; where the existing approach genuinely blocks the work, raise it as its own change rather than resolving it inside an unrelated ticket.
## The ORM will issue queries you did not write
`select_related` for foreign keys and `only`/`defer` where rows are wide; `prefetch_related`
for reverse and many-to-many. Iterating a queryset in a template and touching a related object
produces a query per row — the standard Django performance problem, and it is invisible until
production data volume. Install a query counter in development and look at it.
Querysets are lazy; know where evaluation happens, and use `iterator()` for large result sets
rather than loading everything into memory.
## Migrations are code and need review
Autogenerated migrations do what the field change implied, which is not always what you
intended. Read them. A field rename presents as drop-and-add — data loss — unless expressed
correctly. On a large table, adding a column with a default rewrites it; separate schema and
data migrations and consider the lock.
## Use the framework's security
The ORM parameterizes; `raw()` and `extra()` do not unless you make them. Template
auto-escaping protects you until someone marks something safe. CSRF middleware on, `DEBUG` off
in production with `ALLOWED_HOSTS` set, and never a secret key in the repository. Django's
defaults are good — deviations need justification.
## Settings split by environment, secrets from the environment
One settings module per environment sharing a base, values from environment variables. A
production checklist run before deploy (`manage.py check --deploy`) catches the common
misconfigurations.
## Keep views thin
Business logic in services or model methods, not in views. Fat views are untestable without the
request cycle and end up duplicated between the web view, the management command, and the API.
## Reporting
State the query behavior of what you added with counts, the migration's lock implications, and
the security-relevant settings touched.
> **Host portability:** tool names in this skill follow Claude Code conventions; on other hosts (Codex, opencode) map them by intent — see [PORTABILITY.md](../PORTABILITY.md).
<!-- self-evolve:start -->
## Self-Evolve Loop
Journal: `~/.ink-and-agency/learnings/django-developer.md` (workspace-local
`.ink-and-agency/learnings/django-developer.md` where the sandbox confines writes). Read it
first, append what the run taught last — [SELF-EVOLVE.md](../SELF-EVOLVE.md).
<!-- self-evolve:end -->
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!