Real-World Examples of Django REST Framework Examples for 2025
Before getting fancy, you need a solid baseline. This is the smallest example of a Django REST Framework API that still feels realistic: a read-only endpoint for listing and retrieving Article objects.
## blog/models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=255)
body = models.TextField()
published_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
## blog/api/serializers.py
from rest_framework import serializers
from blog.models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = ["id", "title", "body", "published_at"]
## blog/api/views.py
from rest_framework import viewsets
from blog.models import Article
from .serializers import ArticleSerializer
class ArticleViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Article.objects.order_by("-published_at")
serializer_class = ArticleSerializer
## blog/api/urls.py
from rest_framework.routers import DefaultRouter
from .views import ArticleViewSet
router = DefaultRouter()
router.register("articles", ArticleViewSet, basename="article")
urlpatterns = router.urls
This is one of the cleanest examples of Django REST Framework examples because it uses DRF’s router, a ModelSerializer, and a ReadOnlyModelViewSet together. From here, we can layer on authentication, permissions, filtering, and more.
Auth & permissions: examples of Django REST Framework examples with JWT
Most real APIs need authentication. In 2024–2025, JWT is still a popular option for stateless APIs and mobile apps. Here’s an example of integrating djangorestframework-simplejwt to protect write operations while leaving reads open.
Install the package:
pip install djangorestframework-simplejwt
Update your settings:
## settings.py
INSTALLED_APPS = [
# # ...
'rest_framework',
'rest_framework_simplejwt',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
}
Add token endpoints:
## project/urls.py
from django.urls import path, include
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
urlpatterns = [
path('api/', include('blog.api.urls')),
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
Now protect writes but allow anonymous reads using DRF’s permission classes:
## blog/api/views.py
from rest_framework import viewsets, permissions
from blog.models import Article
from .serializers import ArticleSerializer
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.order_by("-published_at")
serializer_class = ArticleSerializer
def get_permissions(self):
if self.request.method in ("GET",):
return [permissions.AllowAny()]
return [permissions.IsAuthenticated()]
This pattern shows up constantly in production and belongs on any list of the best examples of Django REST Framework examples: public content, private write access, JWT for mobile/web clients.
Filtering, searching, and ordering: examples include real query patterns
Once you expose data, users start asking for search, filters, and ordering. Instead of writing custom query logic in every view, DRF integrates cleanly with django-filter.
Install it:
pip install django-filter
Configure DRF to use it:
## settings.py
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': [
'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.SearchFilter',
'rest_framework.filters.OrderingFilter',
],
}
Here’s an example of a Product API where users can filter by category, search by name, and order by price or rating.
## shop/models.py
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=255)
category = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
rating = models.FloatField(default=0)
in_stock = models.BooleanField(default=True)
## shop/api/views.py
from rest_framework import viewsets
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters
from shop.models import Product
from .serializers import ProductSerializer
class ProductViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = [
DjangoFilterBackend,
filters.SearchFilter,
filters.OrderingFilter,
]
filterset_fields = ["category", "in_stock"]
search_fields = ["name"]
ordering_fields = ["price", "rating"]
ordering = ["-rating"]
Requests like:
GET /api/products/?category=books&in_stock=true&ordering=-price
GET /api/products/?search=headphones
These are very real examples of Django REST Framework examples where developers lean on DRF instead of reinventing query builders.
Nested relationships: examples of DRF handling related objects
APIs rarely expose flat tables. Here’s an example of modeling a Project with nested Task objects and returning them in a single response.
## projects/models.py
from django.db import models
class Project(models.Model):
name = models.CharField(max_length=200)
owner = models.ForeignKey('auth.User', on_delete=models.CASCADE)
class Task(models.Model):
project = models.ForeignKey(Project, related_name='tasks', on_delete=models.CASCADE)
title = models.CharField(max_length=200)
done = models.BooleanField(default=False)
## projects/api/serializers.py
from rest_framework import serializers
from projects.models import Project, Task
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = ["id", "title", "done"]
class ProjectSerializer(serializers.ModelSerializer):
tasks = TaskSerializer(many=True, read_only=True)
class Meta:
model = Project
fields = ["id", "name", "tasks"]
This gives responses like:
{
"id": 1,
"name": "Marketing site redesign",
"tasks": [
{"id": 10, "title": "Wireframes", "done": false},
{"id": 11, "title": "Copy review", "done": true}
]
}
Nested serializers like this are some of the best examples of Django REST Framework examples when you’re explaining how to keep your API shape friendly for frontend teams.
Pagination & performance: examples of DRF for large datasets
If you’re returning thousands of rows, pagination is non‑negotiable. DRF ships with multiple pagination styles. A very common example of a 2025‑style API is cursor pagination, which plays nicely with infinite scroll UIs.
## settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.CursorPagination',
'PAGE_SIZE': 20,
}
## analytics/api/views.py
from rest_framework import viewsets
from rest_framework.pagination import CursorPagination
from analytics.models import Event
from .serializers import EventSerializer
class EventPagination(CursorPagination):
page_size = 50
ordering = '-created_at'
class EventViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Event.objects.all()
serializer_class = EventSerializer
pagination_class = EventPagination
Clients can request:
GET /api/events/
GET /api/events/?cursor=cD0yMDI0LTEyLTAxKzEyJTNBMDA
In real examples of Django REST Framework examples used at scale, cursor pagination dramatically reduces the pain of offset-based pagination on large tables.
Async & background work: examples include Celery integration
By 2024–2025, users expect fast APIs. Offloading heavy work to background tasks is standard practice. Here’s an example of using DRF with Celery to kick off a report generation job.
## reports/tasks.py
from celery import shared_task
@shared_task
def generate_report(report_id):
# # Expensive logic here
from reports.models import Report
report = Report.objects.get(id=report_id)
# # ... generate file ...
report.status = 'ready'
report.save()
## reports/api/views.py
from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.response import Response
from reports.models import Report
from .serializers import ReportSerializer
from reports.tasks import generate_report
class ReportViewSet(viewsets.ModelViewSet):
queryset = Report.objects.all()
serializer_class = ReportSerializer
@action(detail=True, methods=["post"])
def run(self, request, pk=None):
report = self.get_object()
generate_report.delay(report.id)
report.status = 'queued'
report.save(update_fields=["status"])
return Response({"status": "queued"}, status=status.HTTP_202_ACCEPTED)
This pattern shows up constantly in data-heavy backends and is one of the more realistic examples of Django REST Framework examples you’ll see in production codebases.
Rate limiting & throttling: examples of DRF protecting your API
You don’t want a single client to hammer your API. DRF’s throttling system gives you a straightforward way to add rate limits.
## settings.py
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle',
],
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': '1000/day',
}
}
For an example of per-endpoint throttling, imagine a login view that needs a stricter limit:
## accounts/api/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status, throttling
class LoginThrottle(throttling.UserRateThrottle):
scope = 'login'
class LoginView(APIView):
throttle_classes = [LoginThrottle]
def post(self, request):
# # authenticate user
return Response({"detail": "ok"}, status=status.HTTP_200_OK)
## settings.py
REST_FRAMEWORK["DEFAULT_THROTTLE_RATES"]["login"] = "10/hour"
These real examples of Django REST Framework examples matter when you’re designing APIs that are open to the public internet.
Versioning & backwards compatibility: examples for long-lived APIs
If you expect your API to live more than a year, versioning stops being theoretical. DRF has built-in versioning strategies that keep old clients working while you iterate.
Here’s an example of URL-based versioning:
## settings.py
REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
'DEFAULT_VERSION': 'v1',
'ALLOWED_VERSIONS': ('v1', 'v2'),
}
## project/urls.py
from django.urls import path, include
urlpatterns = [
path('api/<str:version>/', include('shop.api.urls')),
]
In your view, you can branch on request.version:
## shop/api/views.py
from rest_framework.response import Response
from rest_framework.views import APIView
class CatalogInfoView(APIView):
def get(self, request, *args, **kwargs):
if request.version == 'v2':
return Response({"message": "New catalog format"})
return Response({"message": "Legacy catalog format"})
This is one of those quiet but very real examples of Django REST Framework examples that separate hobby projects from APIs that survive product pivots.
Security & validation: examples include serializer validation patterns
Security isn’t just about auth. Input validation is where many bugs and vulnerabilities start. DRF’s serializers give you a clean way to enforce rules.
Here’s an example of defensive validation for a Profile API:
## users/api/serializers.py
from rest_framework import serializers
from users.models import Profile
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = ["id", "display_name", "bio", "age"]
def validate_age(self, value):
if value < 13:
raise serializers.ValidationError("Minimum age is 13.")
return value
def validate(self, attrs):
bio = attrs.get("bio", "")
if "http://" in bio or "https://" in bio:
raise serializers.ValidationError("Links are not allowed in bio.")
return attrs
This is the sort of pattern you’ll see recommended in security best practices from organizations like NIST and OWASP — validate input at the boundary, not deep in your business logic.
These are understated but important examples of Django REST Framework examples that keep production APIs safe.
2024–2025 trends: where DRF fits now
If you look at modern stacks in 2024–2025, DRF often sits behind:
- React, Vue, or Next.js frontends
- Native iOS/Android apps
- Data pipelines that consume JSON APIs
Real-world examples include:
- Internal analytics dashboards using DRF + React
- Healthcare apps exposing FHIR‑style JSON to partner systems (with strict auth and auditing, often guided by resources like HealthIT.gov)
- Education platforms backed by DRF APIs, similar in spirit to projects you’ll see coming out of universities like MIT and Harvard
All of these are grounded in the same patterns you’ve seen above: serializers, viewsets, authentication, throttling, and careful validation. The best examples of Django REST Framework examples aren’t flashy; they’re the ones that keep working quietly under real traffic.
FAQ: real examples of common Django REST Framework questions
Q: Where can I see more real examples of Django REST Framework examples?
A: The official DRF tutorial and API guide on django-rest-framework.org include solid patterns. For production‑grade examples, look at open-source projects on GitHub that combine DRF with React or mobile apps; search for repositories tagged django-rest-framework.
Q: Can you give an example of a DRF project structure for a medium app?
A: A common layout is app/api/serializers.py, app/api/views.py, app/api/urls.py, and sometimes app/api/permissions.py and app/api/filters.py. Each app owns its API logic, and the project-level urls.py just wires versions and prefixes. This keeps things maintainable as your list of endpoints grows.
Q: Which authentication methods are most common in real DRF examples?
A: Token auth, JWT (via SimpleJWT), and session auth for same‑origin browser apps. For third‑party integrations, teams often add OAuth2 using packages like django‑oauth‑toolkit.
Q: How do I test these examples of Django REST Framework examples properly?
A: Use DRF’s APIClient or APIRequestFactory in your tests. Write tests for permissions, validation errors, and pagination, not just happy paths. This mirrors how serious teams treat their APIs.
Q: Is DRF still a good choice in 2025 compared to async frameworks?
A: Yes, especially for teams already invested in Django’s ORM and admin. Async frameworks like FastAPI shine for highly concurrent I/O‑heavy workloads, but DRF remains a solid, battle‑tested option for most business APIs, particularly when you need Django’s ecosystem and admin tooling.
Related Topics
Best examples of Django template rendering examples in real projects
Best examples of Django static files example: practical guide for 2025
Best examples of examples of Django model relationships example in real projects
Real-World Examples of Django REST Framework Examples for 2025
Real-world examples of examples of Django middleware example patterns
Practical examples of Django authentication examples for beginners
Explore More Django Code Snippets
Discover more examples and insights in this category.
View All Django Code Snippets