Как автогенерировать контекст для методов 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
элемент.