Как автогенерировать контекст для методов APIView

Мне нужно написать свой собственный класс APIView, который переопределяет APIView от drf, и у него будет автогенерируемый self.context, который я могу передать в сериализатор. Например

class SomeView(APIView):
    def post(self, request):
        ser = SomeSerializer(data=request.data, context = self.context)
        ser.is_valid(raise_exception=True)
        return Response(ser.validated_data)

Почему бы не использовать GenericAPIView [drf-doc], который уже это делает?

Действительно, мы можем работать с:

class SomeView(GenericAPIView):
    serializer_class = SomeSerializer

    def post(self, request):
        ser = self.get_serializer(data=request.data)
        ser.is_valid(raise_exception=True)
        return Response(ser.validated_data)

Здесь используется метод get_serializer_context(), по умолчанию он передает контексту данные request, format и view, но вы можете добавить дополнительные данные контекста, например:

class SomeView(GenericAPIView):
    serializer_class = SomeSerializer

    def post(self, request):
        ser = self.get_serializer(data=request.data)
        ser.is_valid(raise_exception=True)
        return Response(ser.validated_data)

    def get_serializer_context(self):
        return {**super().get_serializer_context(), 'foo': 42}

Таким образом, в качестве контекста будет добавлен дополнительный foo элемент.

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