12 Hidden Gem Django Libraries You Should Know About! [PART 1]

Django is packed with built-in features, but third-party libraries can take your development to the next level. Here are 12 lesser-known…

12 Hidden Gem Django Libraries You Should Know About! [PART 1]
Photo by Milad Fakurian on Unsplash

Django is packed with built-in features, but third-party libraries can take your development to the next level. Here are 12 lesser-known Django libraries that can boost productivity, improve performance, and simplify development!


1. Django Ninja — FastAPI for Django

🔹 Why You Need It: If you love Django but want FastAPI-style APIs, Django Ninja is the perfect solution. It provides automatic OpenAPI docs, async support, and type hints.
https://django-ninja.dev/

🔹 Installation:

pip install django-ninja

🔹 Example:

# urls.py 
from django.contrib import admin 
from django.urls import path 
from ninja import NinjaAPI 
 
api = NinjaAPI() 
 
@api.get("/add") 
def add(request, a: int, b: int): 
    return {"result": a + b} 
 
urlpatterns = [ 
    path("admin/", admin.site.urls), 
    path("api/", api.urls), 
]

💡 Use it for: Building high-performance REST APIs in Django.

2. Django Q — Distributed Task Queue

🔹 Why You Need It: Need asynchronous background tasks without Celery? Django Q provides a simple, scalable alternative.
https://django-q.readthedocs.io/en/latest/

🔹 Installation:

pip install django-q

🔹 Example:

from django_q.tasks import async_task 
 
async_task("app.tasks.send_email", "user@example.com")

💡 Use it for: Scheduling background tasks without extra dependencies.

3. Django Simple History — Track Model Changes

source
🔹 Why You Need It: Ever wished you could track all changes to your Django models? django-simple-history developed by jazzband lets you do exactly that!
https://django-simple-history.readthedocs.io/en/latest/quick_start.html

🔹 Installation:

pip install django-simple-history

🔹 Example:

# settings.py 
INSTALLED_APPS = [ 
    # ... 
    'simple_history', 
] 
 
MIDDLEWARE = [ 
    # ... 
    'simple_history.middleware.HistoryRequestMiddleware', 
] 
 
 
# models.py 
from django.db import models 
from simple_history.models import HistoricalRecords 
 
class Poll(models.Model): 
    question = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 
    history = HistoricalRecords() 
 
class Choice(models.Model): 
    poll = models.ForeignKey(Poll) 
    choice_text = models.CharField(max_length=200) 
    votes = models.IntegerField(default=0) 
    history = HistoricalRecords() 
 
# admin.py 
from django.contrib import admin 
from simple_history.admin import SimpleHistoryAdmin 
from .models import Poll, Choice 
 
admin.site.register(Poll, SimpleHistoryAdmin) 
admin.site.register(Choice, SimpleHistoryAdmin)

💡 Use it for: Audit logging and tracking model changes over time.

4. Django Storages — Handle Media Files Like a Pro

🔹 Why You Need It: django-storages makes it easy to store files in AWS S3, Google Cloud Storage, or Azure.
https://django-storages.readthedocs.io/en/latest/index.html

🔹 Installation:

pip install django-storages[boto3]

🔹 Example (Settings for S3 Storage):

# settings.py 
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' 
AWS_STORAGE_BUCKET_NAME = 'my-bucket'

💡 Use it for: Handling static and media file storage efficiently.

5. Django Extensions — Supercharge Django Management Commands

🔹 Why You Need It: Adds powerful shell tools, auto models graphing, and custom management commands.
https://django-extensions.readthedocs.io/en/latest/index.html

🔹 Installation:

pip install django-extensions

🔹 Example:

# settings.py 
INSTALLED_APPS = ( 
    ... 
    'django_extensions', 
)
python manage.py shell_plus

💡 Use it for: Enhancing Django’s CLI capabilities.

6. Drf-yasg — Auto-Generate Swagger Docs for Django REST Framework

source
🔹 Why You Need It: Need interactive API docs? drf-yasg auto-generates Swagger/OpenAPI documentation.
https://pypi.org/project/drf-yasg/

🔹 Installation:

pip install drf-yasg

🔹 Example:

# settings.py 
INSTALLED_APPS = [ 
   ... 
   'django.contrib.staticfiles',  # required for serving swagger ui's css/js files 
   'drf_yasg', 
   ... 
] 
 
# urls.py 
from django.urls import re_path 
from rest_framework import permissions 
from drf_yasg.views import get_schema_view 
from drf_yasg import openapi 
 
schema_view = get_schema_view( 
   openapi.Info( 
      title="Snippets API", 
      default_version='v1', 
      description="Test description", 
      terms_of_service="https://www.google.com/policies/terms/", 
      contact=openapi.Contact(email="contact@snippets.local"), 
      license=openapi.License(name="BSD License"), 
   ), 
   public=True, 
   permission_classes=(permissions.AllowAny,), 
) 
 
urlpatterns = [ 
   path('swagger<format>/', schema_view.without_ui(cache_timeout=0), name='schema-json'), 
   path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), 
   path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'), 
]

This exposes 4 endpoints:

A JSON view of your API specification at /swagger.json
A YAML view of your API specification at /swagger.yaml
A swagger-ui view of your API specification at /swagger/
A ReDoc view of your API specification at /redoc/

💡 Use it for: Creating Swagger API documentation effortlessly.

7. Django Import Export — Easily Handle CSV & Excel Data

source
🔹 Why You Need It: Simplifies importing and exporting data in Django Admin with support for CSV, Excel, JSON, and more.
https://django-import-export.readthedocs.io/en/latest/

🔹 Installation:

pip install django-import-export

🔹 Example:

# settings.py 
INSTALLED_APPS = ( 
    ... 
    'import_export', 
) 
 
# models.py 
class Author(models.Model): 
    name = models.CharField(max_length=100) 
 
    def __str__(self): 
        return self.name 
 
 
class Category(models.Model): 
    name = models.CharField(max_length=100) 
 
    def __str__(self): 
        return self.name 
 
 
class Book(models.Model): 
    name = models.CharField('Book name', max_length=100) 
    author = models.ForeignKey(Author, blank=True, null=True) 
    author_email = models.EmailField('Author email', max_length=75, blank=True) 
    imported = models.BooleanField(default=False) 
    published = models.DateField('Published', blank=True, null=True) 
    price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True) 
    categories = models.ManyToManyField(Category, blank=True) 
 
    def __str__(self): 
        return self.name 
 
# admin.py 
from import_export import resources 
from core.models import Book 
 
class BookResource(resources.ModelResource): 
 
    class Meta: 
        model = Book

💡 Use it for: Handling large data imports/exports efficiently.

8. Django Debug Toolbar — Debug SQL Queries Like a Pro

🔹 Why You Need It: Visualize SQL queries, cache usage, and performance bottlenecks right in your browser.
https://django-debug-toolbar.readthedocs.io/en/latest/index.html

🔹 Installation:

pip install django-debug-toolbar

🔹 Example:

# settings.py 
INSTALLED_APPS = [ 
    "debug_toolbar", 
] 
 
MIDDLEWARE = [ 
    "debug_toolbar.middleware.DebugToolbarMiddleware", 
] 
 
# urls.py 
from django.urls import include, path 
from debug_toolbar.toolbar import debug_toolbar_urls 
 
urlpatterns = [ 
    # ... the rest of your URLconf goes here ... 
] + debug_toolbar_urls()

💡 Use it for: Debugging slow queries and optimizing Django apps.

9. Django SQL Explorer — Run SQL Queries from Django Admin

source
🔹 Why You Need It: Run SQL queries directly in Django Admin without needing a separate database client.
https://django-sql-explorer.readthedocs.io/en/latest/index.html

🔹 Installation:

pip install django-sql-explorer

🔹 Example:

# settings.py 
INSTALLED_APPS = [ 
    'explorer', 
] 
 
# urls.py 
from django.urls import path, include 
 
urlpatterns = [ 
    path('explorer/', include('explorer.urls')), 
]
python manage.py migrate

💡 Use it for: Running database queries from Django Admin.

10. Django CORS Headers — Fix CORS Issues Fast

🔹 Why You Need It: Need to allow cross-origin requests (CORS) in your Django API? This library makes it easy.
https://pypi.org/project/django-cors-headers/

🔹 Installation:

pip install django-cors-headers

🔹 Example

# settings.py 
INSTALLED_APPS = [ 
    "corsheaders", 
] 
 
MIDDLEWARE = [ 
    ..., 
    "corsheaders.middleware.CorsMiddleware", 
    "django.middleware.common.CommonMiddleware", 
    ..., 
] 
 
CORS_ALLOWED_ORIGINS = [ 
    "https://example.com", 
    "https://sub.example.com", 
    "http://localhost:8080", 
    "http://127.0.0.1:9000", 
] 
 
CORS_ALLOW_METHODS = ( 
    "DELETE", 
    "GET", 
    "OPTIONS", 
    "PATCH", 
    "POST", 
    "PUT", 
) 
 
CORS_ALLOW_HEADERS = ( 
    "accept", 
    "authorization", 
    "content-type", 
    "user-agent", 
    "x-csrftoken", 
    "x-requested-with", 
)

💡 Use it for: Allowing frontend apps to access your Django API.

11. Django Axes — Prevent Brute-Force Attacks

🔹 Why You Need It: django-axes helps protect your login endpoints by blocking repeated failed login attempts.
https://django-axes.readthedocs.io/en/latest/index.html

🔹 Installation:

pip install django-axes[ipware]  # use django-ipware for resolving client IP addresses OR 
pip install django-axes          # implement and configure custom AXES_CLIENT_IP_CALLABLE

🔹 Example

# settings.py  
INSTALLED_APPS = [ 
    'axes', 
] 
 
AUTHENTICATION_BACKENDS = [ 
    # AxesStandaloneBackend should be the first backend in the AUTHENTICATION_BACKENDS list. 
    'axes.backends.AxesStandaloneBackend', 
 
    # Django ModelBackend is the default authentication backend. 
    'django.contrib.auth.backends.ModelBackend', 
] 
 
MIDDLEWARE = [ 
    'axes.middleware.AxesMiddleware', 
]
python manage.py migrate

💡 Use it for: Enhancing security against brute-force attacks.

12. Django Guardian — Fine-Grained Object-Level Permissions

🔹 Why You Need It: django-guardian lets you set permissions at the object level, not just the model level.
https://django-guardian.readthedocs.io/en/stable/index.html

🔹 Installation:

pip install django-guardian

🔹 Example

# settings.py 
INSTALLED_APPS = [ 
    'guardian', 
] 
 
AUTHENTICATION_BACKENDS = ( 
    'django.contrib.auth.backends.ModelBackend', # this is default 
    'guardian.backends.ObjectPermissionBackend', 
) 
 
# models.py 
class Task(models.Model): 
    summary = models.CharField(max_length=32) 
    content = models.TextField() 
    reported_by = models.ForeignKey(User, on_delete=models.CASCADE) 
    created_at = models.DateTimeField(auto_now_add=True) 
 
    class Meta: 
        # assigned new permissions 
        permissions = ( 
            ('assign_task', 'Assign task'), 
        ) 
 
# views.py 
from django.contrib.auth.models import User 
from guardian.shortcuts import assign_perm 
 
def index(request): 
  boss = User.objects.create(username='Big Boss') 
  joe = User.objects.create(username='joe') 
  task = Task.objects.create(summary='Some job', content='', reported_by=boss) 
  joe.has_perm('assign_task', task) # output - False 
 
  # use assign_perm function to assign the permission 
  assign_perm('assign_task', joe, task) 
   
  joe.has_perm('assign_task', task) # output - True

💡 Use it for: Managing per-user or per-group permissions dynamically.

Final Thoughts

Django has an extensive ecosystem, but these 12 hidden gem libraries can help you optimize performance, improve security, and streamline development.

💡 Which one do you find most useful? Let me know in the comments! 🚀


If you enjoyed this article, I’m sure you’ll love Part 2!

12 Hidden Gem Django Libraries You Should Know About! [PART 2]
This is part 2 of “12 Hidden Gem Django Libraries You Should Know About”. If you didn’t check the part 1 you can read…