Django Deep Cuts: QuerySets, Task Queues, Constance, Channels, TimescaleDB
Everyone learns models, views, and the admin. The gap to production is the next layer: killing N+1 queries, offloading work to a queue, changing config without a deploy, pushing live updates, and storing time-series without your DB melting. These are the deep cuts from the Back_End repo’s Django series.
1. QuerySets: kill the N+1
The single biggest Django performance sin is the N+1 query. select_related (SQL join, for FKs) and prefetch_related (second query, for M2M / reverse) collapse it.
| Tool | For | Mechanism |
|---|---|---|
select_related |
FK / one-to-one | SQL JOIN, one query |
prefetch_related |
M2M / reverse FK | Second query, joined in Python |
only / defer |
Wide tables | Fetch fewer columns |
annotate / aggregate |
Rollups | Push maths into SQL |
See QuerySets and Managers and QuerySets.
Rendering a list of 100 objects with a related field - query count before and after:
2. Background work: django-q vs Celery
Anything slow - email, API sync, reports - belongs off the request path. Two common choices:
| django-q | Celery | |
|---|---|---|
| Setup | Minimal, DB/Redis broker | More moving parts |
| Broker | ORM, Redis, others | Redis / RabbitMQ |
| Admin | Django admin integration | Flower / external |
| Scheduling | Built-in schedules | Beat |
| Best for | Small/medium apps | High throughput, complex routing |
I default to django-q for simplicity and move to Celery when throughput or routing demands it.
flowchart LR R[Request] --> V[View] V -->|enqueue| Q[(Broker)] V --> Resp[Fast response] Q --> W[Worker] W --> DB[(DB / side effects)]
3. Constance: config without a deploy
Feature flags and tunables that change from the admin, no redeploy. Perfect for thresholds, toggles, and copy you tweak often. See Django Constance.
4. Channels: real-time
HTTP is request/response; websockets are persistent. Channels adds an ASGI layer so the server can push - live dashboards, notifications, chat.
flowchart LR B[Browser] <-->|websocket| ASGI[Channels / ASGI] ASGI --> G[(Channel layer / Redis)] W[Worker / signal] --> G G --> ASGI
5. TimescaleDB: time-series in Postgres
Sensor and metric data crush a normal table. TimescaleDB is a Postgres extension: hypertables auto-partition by time, so inserts and range queries stay fast at scale - and it’s still just Postgres.
Takeaway
Master these five and Django scales a long way: tight querysets, a task queue, runtime config, websockets, and TimescaleDB for time-series.