Search code examples
djangodjango-rest-framework

how to autogenerate context for APIView methods


I need to write my own APIView class which overrides drf's APIView and it will have autogenerated self.context which I can pass into serializer. For example

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)

Solution

  • Why not use the GenericAPIView [drf-doc] which does that already?

    Indeed, we can work with:

    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)

    This will use the get_serializer_context() method, by default this will pass the request, format, and view to the context, but you can add extra context data like:

    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}

    This will thus add an extra foo item as context.