Pass extra arguments to Serializer Class in Django Rest Framework
It's very easy with "context" arg for "ModelSerializer" constructor.
For example:
in view:
my_objects = MyModelSerializer( input_collection, many=True, context={'user_id': request.user.id}).data
in serializers:
class MyModelSerializer(serializers.ModelSerializer):... is_my_object = serializers.SerializerMethodField('_is_my_find')... def _is_my_find(self, obj): user_id = self.context.get("user_id") if user_id: return user_id in obj.my_objects.values_list("user_id", flat=True) return False...
so you can use "self.context" for getting extra params.
You could in the YourView override get_serializer_context
method like that:
class YourView(GenericAPIView): def get_serializer_context(self): context = super().get_serializer_context() context["customer_id"] = self.kwargs['customer_id'] context["query_params"] = self.request.query_params return context
or like that:
class YourView(GenericAPIView): def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.context["customer_id"] = request.user.id serializer.context["query_params"] = request.query_params serializer.is_valid(raise_exception=True) ...
and anywhere in your serializer you can get it. For example in a custom method:
class YourSerializer(ModelSerializer): def get_alternate_name(self, obj): customer_id = self.context["customer_id"] query_params = self.context["query_params"] ...
To fulfill the answer of redcyb - consider using in your view the get_serializer_context
method from GenericAPIView
, like this:
def get_serializer_context(self): return {'user': self.request.user.email}