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