Skip to content

Serializers Map Mixin

ActionSerializerMixin

Mixin which allows to define specific serializers per action.

It requires a filled serializers_map attribute It should be used for ModelViewSet Examples: class NoteViewSet(ActionSerializerMixin, viewsets.ModelViewSet): queryset = Note.objects.all() serializer_class = NoteSerializer serializers_map = { "update": serializers.UpdateNoteSerializer, "partial_update": serializers.UpdateNoteSerializer, }

Source code in saritasa_drf_tools/views/mixins/serializers_map_mixin.py
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class ActionSerializerMixin:
    """Mixin which allows to define specific serializers per action.

    It requires a filled ``serializers_map`` attribute
    It should be used for ``ModelViewSet``
    Examples:
        class NoteViewSet(ActionSerializerMixin, viewsets.ModelViewSet):
            queryset = Note.objects.all()
            serializer_class = NoteSerializer
            serializers_map = {
                "update": serializers.UpdateNoteSerializer,
                "partial_update": serializers.UpdateNoteSerializer,
            }

    """

    action: str
    serializers_map: dict[str, type[serializers.Serializer]] = {}

    def get_serializer_class(self) -> type[serializers.Serializer]:
        """Get serializer for view's action.

        First we try to find corresponding `action` in `serializer_map` and
        in case if current method is absent in `serializer_map` we return
        `default` from `serializer_map`(if default is not set we use
        serializer_class from `super().get_serializer_class()`).

        Example:
        -------
            serializer_map = {
                "update": serializers.UpdateLeadSerializer,
                "partial_update": serializers.UpdateLeadSerializer,
            }

        """
        default_serializer_class = self.serializers_map.get("default")
        action_serializer_class = self.serializers_map.get(
            self.action,
            default_serializer_class,
        )

        return action_serializer_class or super().get_serializer_class()  # type: ignore

get_serializer_class()

Get serializer for view's action.

First we try to find corresponding action in serializer_map and in case if current method is absent in serializer_map we return default from serializer_map(if default is not set we use serializer_class from super().get_serializer_class()).

Example:
serializer_map = {
    "update": serializers.UpdateLeadSerializer,
    "partial_update": serializers.UpdateLeadSerializer,
}
Source code in saritasa_drf_tools/views/mixins/serializers_map_mixin.py
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
def get_serializer_class(self) -> type[serializers.Serializer]:
    """Get serializer for view's action.

    First we try to find corresponding `action` in `serializer_map` and
    in case if current method is absent in `serializer_map` we return
    `default` from `serializer_map`(if default is not set we use
    serializer_class from `super().get_serializer_class()`).

    Example:
    -------
        serializer_map = {
            "update": serializers.UpdateLeadSerializer,
            "partial_update": serializers.UpdateLeadSerializer,
        }

    """
    default_serializer_class = self.serializers_map.get("default")
    action_serializer_class = self.serializers_map.get(
        self.action,
        default_serializer_class,
    )

    return action_serializer_class or super().get_serializer_class()  # type: ignore