How to hire Django developers: a practical guide for U.S. engineering and HR leaders.
Django is more than twenty years old and still one of the default choices for Python products that have users, permissions and a real data model. The 2025 Django Developers Survey, run by the Django Software Foundation and JetBrains with more than 4,600 respondents, found that 82% use Django professionally, 76% run it on PostgreSQL and 49% use Django REST Framework (JetBrains, State of Django 2025). The framework's maturity is also the hiring problem: almost every Python developer has touched Django, so the keyword on a résumé separates nobody. This guide covers what does.
What Django developers do
Django is a "batteries included" Python web framework. It ships an ORM, a migration system, authentication, a templating engine, security middleware and an auto-generated admin, so a team does not have to choose and wire those pieces itself.
A Django developer's real job is to keep that machinery working as the product grows. On a small app, the ORM makes everything look easy. At a few million rows, the same code sends hundreds of queries per page, a migration locks a table during business hours, and a background job runs twice and charges a customer twice. The skill you are hiring for is knowing what Django does underneath: which SQL a queryset produces, what a migration will do to a live table, and where the framework's defaults stop protecting you.
The four profiles
"Django developer" covers four different hires. Decide which one you need before you write the job description.
| Profile | Owns | Typical stack | Hire when |
|---|---|---|---|
| API backend | REST or GraphQL APIs, auth, permissions, integrations | Django REST Framework or Django Ninja, PostgreSQL, Redis | Your frontend or mobile app is separate and talks to Django over an API. |
| Full stack Django | Features end to end, API and UI | Django + React, or Django templates with HTMX | A small team ships features end to end. React is used by 32% of Django developers and HTMX by 24% (State of Django 2025). |
| Data-heavy backend | Background jobs, imports, reporting, integrations with data and ML services | Celery, Redis or RabbitMQ, PostgreSQL, pandas | Work happens outside the request: file processing, syncs, scheduled jobs. |
| Monolith owner / lead | App boundaries, upgrades, migration practice, performance | Django LTS versions, pytest-django, profiling tools | The codebase is large, on an old version, or several teams contribute to it. |
If the work is mostly services and APIs across more than one language, you are really hiring backend engineers, with Django as one of the stacks.
Django, FastAPI or Flask
All three are Python, and many engineers have used all three. They are still different hires.
- Django fits products built around a data model: users, roles, orders, records, and the back-office screens to manage them. The ORM, migrations and admin are where Django experience shows, and they are what take time to learn well.
- FastAPI fits async-first APIs, typed request and response models, and services that sit next to an ML model. It brings no ORM or admin of its own, so the team picks SQLAlchemy or another data layer.
- Flask is minimal. Every Flask codebase makes its own choices for ORM, migrations and auth, so experience transfers less directly between Flask projects.
A common setup is Django for the core product and FastAPI for one or two services beside it. Hire for the framework that holds most of your code. If the role spans data pipelines, ML and several frameworks, our guide to hiring Python developers covers the broader Python profiles.
Seniority you need
- Mid-level developers build features with Django's standard patterns: models, views, serializers, forms. Good for well-scoped work in a codebase with established conventions.
- Senior developers design the data model other people build on, read the SQL behind a queryset, write migrations that are safe on live data, and make background work reliable. This is the level most teams mean when they say "Django developer."
- Lead engineers set the conventions: how apps are split, where business logic lives, how and when to upgrade, what gets tested. If this person will also run the team's rituals and reviews, you are hiring a tech lead, not only a senior developer.
Years with Django are a weak signal. An engineer can have eight years on one codebase that never left an unsupported version.
One developer or a team
One senior full stack Django developer can carry a small product or a well-defined project such as an upgrade or a performance cleanup. Move to a team when you have parallel workstreams (a customer-facing app and a public API, say) or when the data model starts to need an owner. A common shape for a Django product squad is two backend-leaning engineers, one full stack engineer who owns the React or HTMX side, and a lead.
Job description essentials
A useful Django job description answers what candidates actually filter on:
- Versions: Django and Python versions today, and whether an upgrade is planned.
- API layer: Django REST Framework, Django Ninja or GraphQL (Graphene or Strawberry), and who consumes it.
- Frontend: React, HTMX with Django templates, or none.
- Data: database, size of the largest tables, read and write volume.
- Background and async work: Celery, RQ or Django's tasks framework, Channels or async views.
- Deployment: Gunicorn or Uvicorn, containers, cloud provider, how migrations run in CI/CD.
- Testing: pytest-django or Django's test runner, factories, coverage expectations.
- AI tooling: which coding assistants the team uses and how generated code is reviewed.
- Team and hours: team size, who they report to, required overlap with U.S. hours.
Skip "Django, Flask, FastAPI, Tornado and Pyramid." A list like that tells candidates you have not decided what you need.
Skills, layer by layer
Python core
- Classes and inheritance, decorators, context managers, generators and dunder methods, used where they help readability.
- Type hints: 80% of Django developers use or plan to use them (State of Django 2025).
ORM and data modeling
- Relationships,
on_deletechoices,throughmodels for many-to-many, constraints and indexes declared on the model. - Query performance:
select_relatedfor foreign keys,prefetch_relatedandPrefetchfor reverse and many-to-many relations,only()andvalues()when full objects are not needed,annotate()and aggregates instead of Python loops. - Reading the SQL:
queryset.query,EXPLAIN, django-debug-toolbar, andassertNumQueriesin tests. - Awareness of what is new: Django 6.1 (August 2026) added model field fetch modes, which change how deferred fields and related objects are loaded on demand, and database-level delete options for
ForeignKey.on_delete(Django 6.1 release).
Migrations
- Schema and data migrations kept separate;
RunPythonwith a reverse function;sqlmigrateto check the SQL before it runs. - Multi-step changes on large tables: add nullable, backfill in batches, then add the constraint.
- Resolving migration conflicts between branches without editing migrations that already ran in production.
APIs
- DRF serializers, viewsets, routers, pagination, throttling and object-level permissions.
- Scoping querysets per user or tenant in
get_queryset(), not only in the frontend. - OpenAPI schemas (drf-spectacular) for the teams that consume the API. For a practical walkthrough, see our article on building RESTful APIs with Django REST Framework.
Background and async work
- Celery tasks that are idempotent, take IDs instead of model instances, and are enqueued with
transaction.on_commit(). - Django 6.0 (December 2025) added a built-in background tasks framework; it defines and queues tasks, while execution still needs an external worker (Django 6.0 release notes).
- Async views under ASGI for I/O-bound work such as calls to external APIs, and knowing that sync middleware or sync ORM calls in an async path add overhead.
Security
- What Django gives by default (CSRF protection, template auto-escaping, parameterized ORM queries, clickjacking protection) and what breaks it: string-formatted SQL in
raw()orextra(),mark_safeon user input,DEBUG = Truein production. manage.py check --deploy, theSECURE_*settings, and Django 6.0's built-in Content Security Policy support.- DRF's default permission class is
AllowAny. A senior engineer sets a safe default globally.
AI-assisted work
- Reviewing generated code for invented ORM methods, missing permission classes,
fields = "__all__"on public serializers, and N+1 queries hidden inside serializer methods.
How to interview
A loop that separates senior Django developers from engineers who have only used Django:
- 1Screen (30 min)Walk through a Django codebase they worked on. Ask about the largest table, the slowest endpoint, and a migration that went wrong.
- 2Live exercise in DjangoBuild a small feature with two related models, a migration, a DRF endpoint with permissions, and one test. Watch how they model the data before they write views.
- 3Code review (30 min)Give them a pull request with an N+1 query inside a serializer, a migration that adds a non-null column to a large table in one step, a Celery task enqueued inside a transaction, and an AI-generated view that skips permissions. Ask for review comments.
- 4Team conversationHow they disagree in a review, how they explain a risky migration to a product manager.
Let candidates use their usual AI tools in the exercise, and ask them to explain what they accepted. The candidate who reviews and adapts generated code is the one you want.
Interview questions
- A DRF list endpoint gets slower every month. Each item shows its author and tags. What do you check first?Best answerN+1 queries:
select_relatedfor the author,prefetch_relatedfor tags, then pagination and indexes. They measure with query counts or django-debug-toolbar before and after. - You need a new non-null column on a table with 50 million rows. How do you ship it?Best answerSeveral steps across deploys: add the column as nullable (or with a database default), backfill in batches outside one long transaction, then add the constraint. They check the SQL with
sqlmigratefirst. - A Celery task that charges a card sometimes runs twice. Why, and how do you fix it?Best answerDelivery is at least once; retries and worker restarts can repeat a task. Fix with an idempotency key, pass IDs not objects, and enqueue with
transaction.on_commit(). - When would you use an async view in Django, and what can go wrong?Best answerFor I/O-bound work under ASGI, such as calling slow external APIs. Sync middleware and sync ORM calls in the path add thread hops, and async does not help CPU-bound work.
- Where would you use signals, and where would you avoid them?Best answerSignals hide control flow and do not fire on
queryset.update()orbulk_create(). Strong candidates prefer explicit service functions for business logic and keep signals for decoupled side effects. - What does a new DRF endpoint allow if nobody sets permissions?Best answer
AllowAnyby default. They setIsAuthenticatedglobally, add object-level permissions, and scopeget_queryset()per user or tenant. - How would you move a project from Django 4.2 to 5.2 LTS or 6.x?Best answerOne feature release at a time, running tests with deprecation warnings enabled (
python -Wd), checking third-party packages, and handling changes such as theDEFAULT_AUTO_FIELDdefault moving toBigAutoFieldin 6.0. - An AI assistant wrote a view that passes all tests. What do you check before merging?Best answerPermissions, queryset scoping, raw SQL, serializer fields exposed, query count, and whether every ORM method it calls exists.
Red flags
- Raw SQL built with f-strings or
%formatting. fields = "__all__"on serializers that face the public.- They have never used
select_relatedorprefetch_related, or cannot say when each applies. - They "fix" migration conflicts by deleting or editing migrations that already ran in production.
- Business logic spread across signals that nobody can trace.
- Every example is on a Django version that is no longer supported, with no upgrade experience.
- They trust AI-generated code because the tests pass.
What it costs
The U.S. median base salary for software developers is $135,980 (BLS, May 2025), before payroll taxes, benefits, equipment and recruiting. Senior Django developers who own a large data model or lead a team usually sit above the median.
A senior LatAm Django developer through BEON.tech costs $6,800 to $8,500 per month, all-inclusive ($81,600 to $102,000 per year). Full stack Django + React engineers are $6,600 to $8,500 per month, depending on whether the role is frontend- or backend-led. Use the LatAm developer cost calculator to compare by country and seniority.
Nearshore in LATAM
Latin America works in U.S. hours, 0 to 4 hours from Eastern time. For Django work that matters in specific moments: a migration reviewed and deployed the same day, a production incident on the task queue handled while your team is online, a data model discussed live instead of across a night of async comments. Our network includes more than 6,300 Django engineers, more than 4,000 of them senior or above. For a broader view of the region, see our guide to hiring Latin American developers.
Hiring model comparison
| Model | Speed | Vetting done for you | Payroll & compliance | Best for |
|---|---|---|---|---|
| In-house U.S. hire | Slowest | No | You | Roles that must be U.S.-based |
| Freelance marketplace | Fast | Partial, résumé level | Contractor | Short, well-defined tasks |
| Django development agency | Varies | Agency's own team | Agency | A project you want built outside your team |
| Staff augmentation (BEON.tech) | 24–48h shortlist, 2-week start | Yes, live interview + recording | BEON.tech | Ongoing product work on your team |
| Contract-to-hire (BEON.tech) | Same as staff augmentation | Yes | BEON.tech, then you | An upgrade or role you want to trial first |
| IT recruitment (BEON.tech) | Shortlist first, then your process | Yes | You | Lead roles that set conventions |
The first 90 days
- Week 1Repository access, local environment with migrations running, a walkthrough of the core models, settings, and task queues. First small pull request merged.
- Weeks 2 to 4Owns a feature end to end, including its migration. Reviews other people's pull requests.
- Month 2Proposes one measured improvement: a slow endpoint fixed with query counts before and after, a safer migration practice, or a flaky task made idempotent.
- Month 3Owns an app or area of the codebase. If an upgrade or a performance project was the reason for the hire, it has a plan with milestones.
Hiring with BEON.tech
Tell us your Django and Python versions, your API layer and frontend, and where the codebase hurts today. Within 24 to 48 hours you get two or three senior Django developers, each with the recording and scorecard of a live interview in Python and Django. Most engineers start within two weeks, and 88% are still on the team after year one.




























