DRF get_serializer_class не проходит

Здесь у меня есть набор представлений:

class TenderViewSet(viewsets.ModelViewSet):
    """ API ViewSet for Propopsition """

    queryset = models.Tender.objects.all()
    serializer_class = serializers.TenderGetSerializer
    
    
    def get_serializer_class(self):
        print('get_serializer_class passed')
        if self.action == 'map':
            self.serializer_class = serializers.TenderMapSerializer
            print('if passed')
        return super().get_serializer_class()

    @action(detail=True, methods=['get'])
    def map(self, request):
        print('action map passed')
        print(self.serializer_class)
        tenders = self.serializer_class.setup_eager_loading(models.Tender.objects.all())
        serializer = serializers.TenderGetSerializer(tenders, many=True)
        return Response(serializer.data, status.HTTP_200_OK)

Я получаю данные с TenderGetSerializer вместо TenderMapSerializer и get_serializer_class метод не проходит.

Выход:

action map passed 
<class 'tender.serializers.TenderGetSerializer'> 
HTTP GET /api/tenders/map/ 200 [0.19, 127.0.0.1:55247]

Разница в сериализаторах: TenderGetSerializer возвращает все поля (около 20), а TenderMapSerializer возвращает 5 полей.

Надеемся на вашу помощь. Хорошего дня!

UPD: serializer = self.serializer_class(tenders, many=True) вместо serializer = serializers.TenderGetSerializer(tenders, many=True) не устраняет проблему

возвращает serializers.Default вместо super().get_serializer_class()

попробуйте реализовать метод get_serializer_class следующим образом:

    def get_serializer_class(self):
        if self.action == 'map':
            return serializers.TenderMapSerializer
        return super().get_serializer_class()

поэтому верните класс сериализатора вместо того, чтобы перезаписывать класс сериализатора по умолчанию. Затем используйте его в вашем map действии:

    @action(detail=True, methods=['get'])
    def map(self, request):
        serializer_class = self.get_serializer_class()
        # rest of your code

EDIT (из комментариев): get_serializer_class метод вызывается автоматически для методов POST, но не для GET

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