Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass extra arguments to Serializer Class in Django Rest Framework

I want to pass some arguments to DRF Serializer class from Viewset, so for I have tried this:

class OneZeroSerializer(rest_serializer.ModelSerializer):      def __init__(self, *args, **kwargs):         print args # show values that passed      location = rest_serializer.SerializerMethodField('get_alternate_name')      def get_alternate_name(self, obj):         return ''       class Meta:         model = OneZero          fields = ('id', 'location') 

Views

class OneZeroViewSet(viewsets.ModelViewSet):     serializer_class = OneZeroSerializer(realpart=1)    #serializer_class = OneZeroSerializer     queryset = OneZero.objects.all() 

Basically I want to pass some value based on querystring from views to Serializer class and then these will be allocate to fields.

These fields are not include in Model in fact dynamically created fields.

Same case in this question stackoverflow, but I cannot understand the answer.

Can anyone help me in this case or suggest me better options.

like image 810
Shoaib Ijaz Avatar asked Apr 10 '14 13:04

Shoaib Ijaz


People also ask

How do you pass extra context data to Serializers in Django REST framework?

In function based views we can pass extra context to serializer with "context" parameter with a dictionary. To access the extra context data inside the serializer we can simply access it with "self. context". From example, to get "exclude_email_list" we just used code 'exclude_email_list = self.

Do we need Serializers in Django REST framework?

Serializers in Django REST Framework are responsible for converting objects into data types understandable by javascript and front-end frameworks. Serializers also provide deserialization, allowing parsed data to be converted back into complex types, after first validating the incoming data.

How do you make a serializer optional in Django?

By default it is set to False. Setting it to True will allow you to mark the field as optional during "serialization".

What is the difference between ModelSerializer and HyperlinkedModelSerializer?

The HyperlinkedModelSerializer class is similar to the ModelSerializer class except that it uses hyperlinks to represent relationships, rather than primary keys. By default the serializer will include a url field instead of a primary key field.


1 Answers

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

like image 82
redcyb Avatar answered Sep 25 '22 17:09

redcyb