Your client asks: "Who changed that record, and when?"
You have no audit trail.
You have no idea.
Use case #01
There's a package for that.
Use case #01
django-simple-history
Stores a full change history for every model instance.
View diffs, revert changes — straight from the Django admin.
pip install django-simple-history
github.com/django-commons/ django-simple-history
Use case #02
You want to run logic
when a model field changes —
but only if the old value
was something specific.
You reach for another Signal handler.
Use case #02
There's a package for that.
Use case #02
django-lifecycle
Declarative model lifecycle hooks. No more post_save spaghetti. @hook(AFTER_UPDATE, when="status", has_changed=True)
Logic lives on the model. Readable. Testable. Done.
pip install django-lifecycle
github.com/rsinger86/ django-lifecycle
Use case #03
You need background tasks.
Someone says: "Just use Celery."
Now you maintain Redis,
a broker, a worker, Flower, Beat —
to send a welcome email.
Use case #03
There's a package for that.
Use case #03
django-tasks
The official Django background task backport, based on DEP 14.
DB-backed. No broker. No extra infrastructure. @task() def send_welcome(user_id): ... — that's it.
pip install django-tasks
github.com/realOrangeOne/ django-tasks
Use case #04
Production is on fire.
You grep the logs.
Every request's log lines
are mixed together.
You can't tell which line
belongs to which request.
Use case #04
There's a package for that.
Use case #04
django-guid
Middleware that injects a unique Correlation-ID into every log message
for the duration of a request — automatically.
Also forwards the ID to downstream services.
pip install django-guid
github.com/snok/ django-guid
Use case #05
You want to catch N+1 queries —
not in the browser devbar,
but in CI,
before they ever hit prod.
Use case #05
There's a package for that.
Use case #05
django-zeal
Detects N+1 queries and raises clear, human-readable errors
during your test suite. Fails in CI. Ships nothing.
Massively underrated.
pip install django-zeal
github.com/taobojlen/ django-zeal
Use case #06
New feature is ready.
Roll it out to 10% of users first.
Without a redeploy.
Without an if/else jungle.
Use case #06
There's a package for that.
Use case #06
django-waffle
Feature flags, switches, and percentage-based samples.
Managed live via the Django admin. No redeploy needed.
Roll out to groups, users, or a random sample.
pip install django-waffle
github.com/django-waffle/ django-waffle
Use case #07
You need testable,
structured transactional emails.
Not send_mail("Subject", ...)
copy-pasted across the codebase.
Actual unit-testable email objects.
Use case #07
There's a package for that.
Use case #07
django-pony-express
Class-based emails — each email is a proper Python class.
Built-in test suite: assert email content without sending.
Clean, structured, no magic strings scattered everywhere.
You want Django to automatically detect
when a teammate pushes a commit without tests,
cross-reference their Slack calendar,
wait until they're in a meeting,
then send a passive-aggressive DM.
There's a package for that.
Nope.
There is no package for that.
Special case
Some problems aren't technical.
This is a team problem.
Or a hiring problem.
Or a leadership problem.
No package in the world helps you here.
What does help: pytest + required coverage in CI.
Block the merge before it happens.
That package is called: consistency.
Go explore. There's a package for (almost) everything.