Skip to main content

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-serializer

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",
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

drf_action_serializers-0.1.0.tar.gz (16.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

drf_action_serializers-0.1.0-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file drf_action_serializers-0.1.0.tar.gz.

File metadata

File hashes

Hashes for drf_action_serializers-0.1.0.tar.gz
Algorithm Hash digest
SHA256 9b4831b856533e0188fc3e20aecf869e0ed5f88db1edc58a7aa7967790adce69
MD5 daa58c43ae14138858200c6e1a04ce0d
BLAKE2b-256 ad791e76ddf99093eb90f1aef7f324eaa164c87532ef3bcc1f67850b2cce23e1

See more details on using hashes here.

File details

Details for the file drf_action_serializers-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for drf_action_serializers-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 682fad6a477c6a711d16ee072a846686eb6dc00b618977122f69c9de55892cb9
MD5 16ddc0a24a3cd00674a24584b4f2968f
BLAKE2b-256 c8034c76e6f35615c67f83d17299de1fc9b44525ebfd41822d824878fbc0ab6f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page