Django UpdateModelMixin: Easily Add Update Functionality to Your API
Last updated 5 months, 3 weeks ago | 388 views 75 5
Introduction: Why UpdateModelMixin Matters
When building APIs, updating existing resources is a must-have feature. Whether you're editing a blog post, updating user settings, or changing an order status—you need a way to handle PUT and PATCH requests cleanly and efficiently.
That’s where Django REST Framework’s UpdateModelMixin shines. It provides built-in logic to update model instances using minimal boilerplate, saving you from writing repetitive code.
In this article, we’ll explore how to use UpdateModelMixin to implement update functionality with both full (PUT) and partial (PATCH) support.
What is UpdateModelMixin?
UpdateModelMixin is a DRF mixin that provides an .update() method, allowing you to easily build API views that support updating a single object.
It handles:
-
Retrieving the object via
get_object() -
Validating incoming data with a serializer
-
Updating the model instance
-
Returning a response (200 OK)
You typically use it with GenericAPIView, or pair it with other mixins like RetrieveModelMixin or DestroyModelMixin.
How UpdateModelMixin Works
Internals of the .update() method:
-
Accepts
request,*args, and**kwargs -
Calls
get_object()to fetch the object -
Uses
serializer.save()to update the object -
Returns a 200 response with the updated data
Step-by-Step Implementation of UpdateModelMixin
1. Create a Django Model
# models.py
from django.db import models
class Profile(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
bio = models.TextField(blank=True)
def __str__(self):
return self.name
2. Build the Serializer
# serializers.py
from rest_framework import serializers
from .models import Profile
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = '__all__'
3. Create the Update View Using UpdateModelMixin
# views.py
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import UpdateModelMixin
from .models import Profile
from .serializers import ProfileSerializer
class ProfileUpdateView(UpdateModelMixin, GenericAPIView):
queryset = Profile.objects.all()
serializer_class = ProfileSerializer
# Handles PUT and PATCH requests
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
4. Hook It Up in urls.py
# urls.py
from django.urls import path
from .views import ProfileUpdateView
urlpatterns = [
path('profiles/<int:pk>/update/', ProfileUpdateView.as_view(), name='profile-update'),
]
✅ Full Functional Example
# models.py
class Profile(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
bio = models.TextField(blank=True)
# serializers.py
class ProfileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = '__all__'
# views.py
class ProfileUpdateView(UpdateModelMixin, GenericAPIView):
queryset = Profile.objects.all()
serializer_class = ProfileSerializer
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
# urls.py
urlpatterns = [
path('profiles/<int:pk>/update/', ProfileUpdateView.as_view(), name='profile-update'),
]
Now, you can:
-
Send a
PUTrequest to/profiles/1/update/to fully update a profile. -
Send a
PATCHrequest to the same URL to update only specific fields.
Tips & Common Pitfalls
✅ Best Practices
-
Use
PATCHfor partial updates to avoid overwriting unintended fields. -
Validate data in your serializer—especially for critical fields like emails or passwords.
-
Log changes or send notifications if your application requires tracking updates.
❌ Common Mistakes
| Mistake | What Happens | Fix |
|---|---|---|
Forgetting .partial=True in PATCH |
Fields not provided are required unnecessarily | Use partial_update() correctly |
Not including put() or patch() views |
DRF throws 405 Method Not Allowed | Define both methods in the view |
Omitting queryset in view |
Throws assertion error or fails silently | Always define queryset |
PUT vs PATCH: Quick Comparison
| Feature | PUT | PATCH |
|---|---|---|
| Update Type | Full update | Partial update |
| Missing Fields | Will be overwritten | Will be ignored |
| Use Case | Replace entire resource | Update specific fields |
When to Use UpdateModelMixin vs UpdateAPIView
| Use Case | Recommendation |
|---|---|
| Want flexibility + multiple mixins | UpdateModelMixin |
| Only need update functionality | UpdateAPIView |
| Combining retrieve, update, and delete | Use in RetrieveUpdateDestroyAPIView |
Conclusion: Simplify Your API with UpdateModelMixin
Django’s UpdateModelMixin helps you implement robust update functionality with minimal effort. It’s flexible, composable, and ideal for situations where you want clean, maintainable views without boilerplate.
To summarize:
-
Use it with
GenericAPIViewfor reusable views -
Add both
put()andpatch()for complete and partial updates -
Combine with other mixins to build powerful, DRY API views