Serializer_action_class не работает в modelviewset в DRF

Я пытаюсь сделать класс сериализатора динамическим, но это не работает. У меня есть класс сериализатора по умолчанию, а также динамический класс сериализатора для различных действий. Вот моя модельviewset.

Мое мнение:

class ClassView(viewsets.ModelViewSet):
    queryset = Class.objects.all()
    serializer_class = ClassSerializer
    serializer_action_classes = {
        'put': AddStudentstoClassSerializer,
    }

    def get_serializer_class(self):

        """
            returns a serializer class based on the http method
        """
        try:
            return self.serializer_action_classes[self.action]
        except (KeyError, AttributeError):
            print("iam ClassSerializer")
            return super(ClassView, self).get_serializer_class()

Моя функция внутри того же modelviewset выше

    @action(detail=True, methods=['put'])
    def add_remove_students(self, request, *args, **kwargs):
      ................

Мой адрес указан ниже:

urlpatterns = [
    path("class/<int:pk>/<slug:slug>/",views.ClassView.as_view({"put": "add_remove_students"}),
    ),
]

В приведенном выше фрагменте кода я пытаюсь получить AddStudentstoClassSerializer внутри функции add_remove_students, но это не работает. Как мы видим, код print("iam ClassSerializer") работает, однако то, что я хотел, или AddStudentstoClassSerializer.

Прежде всего, ваш словарь serializer_action_classes должен выглядеть следующим образом:

serializer_action_classes = {
    'add_remove_students': AddStudentstoClassSerializer,
}

Потому что self.action возвращает имя действия, а не имя метода. То, что вы хотите использовать, это атрибут self.request.method, который должен возвращать PUT в данном случае...

Но есть лучший способ достичь своей цели:

@action(detail=True, methods=['put'], serializer_class=AddStudentstoClassSerializer)
    def add_remove_students(self, request, *args, **kwargs):

action декораторы могут самостоятельно овердрайвить используемый класс serializer_class.

Вернуться на верх