Pass extra arguments to Serializer Class in Django Rest Framework Pass extra arguments to Serializer Class in Django Rest Framework python python

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.

Reference


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}