Easily specify a serializer for each action and method combination
Project description
drf-action-serializers
An easy way to use different serializers for different actions and request methods in Django REST Framework
Imagine a simple Django REST Framework serializer and view like this:
from rest_framework import serializers
from rest_framework import viewsets
from .models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = "__all__"
class PostViewSet(viewsets.ModelViewSet):
serializer_class = PostSerializer
def get_queryset(self):
return Post.objects.all()
The PostSerializer class is used for everything: the list of posts, retrieving a single post, the payload when creating or updating a post, and the response when creating or updating a post.
I find that this is often not what I want; for example I often want a simple version of the model to be returned in the list endpoint (/posts/), while the full model is returned in the retrieve endpoint (/posts/{post_id}/). And I also often want that the input serializer is different from the output serializer, when creating or updating something.
And when you add extra router actions to your ViewSets and you want to use different serializers for them as well? Things are getting complicated and messy real fast.
That’s where drf-action-serializer comes in. Now your view can look like this:
class PostViewSet(ActionSerializerModelViewSet):
serializer_class = PostDetailSerializer
list_serializer_class = PostListSerializer
write_serializer_class = PostWriteSerializer
And just like that you’re using a different serializer for the list action, and for the create and update actions.
Or you can get super specific, like this:
class PostViewSet(ActionSerializerModelViewSet):
list_read_serializer_class = PostListSerializer
retrieve_read_serializer_class = PostDetailSerializer
create_write_serializer_class = PostWriteSerializer
create_read_serializer_class = PostListSerializer
update_write_serializer_class = PostWriteSerializer
update_read_serializer_class = PostDetailSerializer
Now you’re using different input and output serializers as well!
Installation and usage
Install the package:
$ uv add drf-action-serializers
And then use its ViewSets like ActionSerializerModelViewSet, ActionSerializerReadOnlyModelViewSet, and ActionSerializerGenericViewSet, instead of Django REST Framework’s built-in ViewSets.
from drf_action_serializers import viewsets
class PostViewSet(ActionSerializerModelViewSet):
retrieve_serializer_class = PostDetailSerializer
list_serializer_class = PostListSerializer
create_write_serializer_class = PostCreateSerializer
create_read_serializer_class = PostListSerializer
update_write_serializer_class = PostUpdateSerializer
update_read_serializer_class = PostListSerializer
Note: this package is built on top of Django Rest Framework, so it assumes that Django Rest Framework is installed and added to your project as documented.
drf-spectacular support
If you use drf-spectacular, then install the following optional package:
$ uv add drf-action-serializers[spectacular]
Then add the following to settings.py and it’s automatically used:
REST_FRAMEWORK = {
"DEFAULT_SCHEMA_CLASS": "drf_action_serializer.spectacular.ActionSerializerAutoSchema",
}
Tests
Unit tests can be run with uv run pytest.
About Feature Requests
This project is feature-complete — it does what I needed it to do, and I’m not actively looking to expand its functionality.
I’m not accepting feature requests via issues. Please understand that asking for new features is essentially asking for free work — not just to build something, but to maintain it over time. And since I don’t personally need those features, I’m unlikely to invest time in them.
If you’d like to add a new feature, you’re welcome to open a pull request. Just know that I’ll evaluate it carefully, because even merged contributions become part of what I maintain. To avoid spending time on a PR that may not be accepted, I recommend starting a discussion first — that way we can talk through the idea and see if it fits.
This approach helps me avoid burnout and keep the project sustainable. Thanks for understanding!
Credits
Many thanks to rest-framework-actions and drf-rw-serializers for the inspiration.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file drf_action_serializers-0.2.1.tar.gz.
File metadata
- Download URL: drf_action_serializers-0.2.1.tar.gz
- Upload date:
- Size: 4.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
92c3e769f25313a441dc1a7dfc7a54a8dca1b20dbf81c485fd76311affa913d2
|
|
| MD5 |
d3c96905700ac47a02c43fe9e2e1410f
|
|
| BLAKE2b-256 |
9aeb1f38dd5c484a6891a064eb311edb534a1f916a9cad0a4daeff46f287179a
|
Provenance
The following attestation bundles were made for drf_action_serializers-0.2.1.tar.gz:
Publisher:
release.yml on loopwerk/drf-action-serializers
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
drf_action_serializers-0.2.1.tar.gz -
Subject digest:
92c3e769f25313a441dc1a7dfc7a54a8dca1b20dbf81c485fd76311affa913d2 - Sigstore transparency entry: 696096578
- Sigstore integration time:
-
Permalink:
loopwerk/drf-action-serializers@be12a7b8e06924e9524fca0dc597b8319290a805 -
Branch / Tag:
refs/tags/0.2.1 - Owner: https://github.com/loopwerk
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@be12a7b8e06924e9524fca0dc597b8319290a805 -
Trigger Event:
push
-
Statement type:
File details
Details for the file drf_action_serializers-0.2.1-py3-none-any.whl.
File metadata
- Download URL: drf_action_serializers-0.2.1-py3-none-any.whl
- Upload date:
- Size: 6.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
20be6e4a0c50486de3172d7b45f9e95e8669a8dfe681ab85dc74b656a31ae6cd
|
|
| MD5 |
ed71c0a92d5db3c4ebcae9bdb67b6dc0
|
|
| BLAKE2b-256 |
6cdf500bda88dd2e18e31b16867b0a3d5b7f2cab0819812f85974acfced98d97
|
Provenance
The following attestation bundles were made for drf_action_serializers-0.2.1-py3-none-any.whl:
Publisher:
release.yml on loopwerk/drf-action-serializers
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
drf_action_serializers-0.2.1-py3-none-any.whl -
Subject digest:
20be6e4a0c50486de3172d7b45f9e95e8669a8dfe681ab85dc74b656a31ae6cd - Sigstore transparency entry: 696096579
- Sigstore integration time:
-
Permalink:
loopwerk/drf-action-serializers@be12a7b8e06924e9524fca0dc597b8319290a805 -
Branch / Tag:
refs/tags/0.2.1 - Owner: https://github.com/loopwerk
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@be12a7b8e06924e9524fca0dc597b8319290a805 -
Trigger Event:
push
-
Statement type: