Установка условного класса сериализатора удаляет пользовательский класс сериализатора для дополнительного действия в Django rest framework
У меня есть один modelviewset и несколько дополнительных действий для него.
class TestViewset(
mixins.RetrieveModelMixin,
mixins.ListModelMixin,
mixins.UpdateModelMixin,
GenericViewSet,
):
permission_classes = [CustomPermissionClass]
def get_serializer_class(self) -> Type[ModelSerializer]:
if self.action == "list" or self.action == "get":
return FirstSerializer
return SecondSerializer
@action(
detail=True,
methods=["POST"],
url_path="test-path",
url_name="test-path",
serializer_class=MyCustomSerializer,
)
def test_path(self, request: Request, **kwargs) -> Response:
print(self.get_serializer()) # Despite setting the 'MyCustomSerializer' it still gives me 'SecondSerializer'
return Response(status=status.HTTP_200_OK)
Если я удалю метод get_serializer_class
и дам только один сериализатор, он работает.
Что может быть лучшим решением для этого или это какая-то ошибка в drf?
В идеале дополнительное действие должно использовать класс сериализатора, который был предоставлен, но это не так.
Возможно, для этого есть лучший подход, но, насколько я понимаю, это можно исправить, изменив get_serializer_class
на
def get_serializer_class(self) -> Type[ModelSerializer]:
if self.action == "list" or self.action == "get":
return FirstSerializer
return self.serializer_class or SecondSerializer
Это обеспечит использование serializer_class
, определенного в вашем действии, если действие не является ни list, ни get.