Sreekanth Reddy Balne
Sreekanth Reddy Balne

Reputation: 3424

How to pass arguments to a Serializer in django-rest-framework?

I have a serializer as:

class DataSerializer(serializers.Serializer):
    skip_place = True
    name = serializers.CharField(max_length=None)
    place = serializers.CharField(max_length=None,required=False)

def validate_place(self,value): if not skip_place and len(value)<=0: raise serializers.ValidationError("Place is required.")

Now observe skip_place. If I call the DataSerializer instance as:

DataSerializer(data=data, skip_place=False)

Then it should validate over place as in the code.

But I was not able to pass the argument skip_place=True. I get an error: TypeError: __init__() got an unexpected keyword argument 'skip_place'

Upvotes: 1

Views: 5118

Answers (2)

aman kumar
aman kumar

Reputation: 3156

Hi You can override the init method of serializer, pop the value from there and assign into variable.

class DataSerializer(serializers.Serializer):
   skip_place = True
   name = serializers.CharField(max_length=None)
   place = serializers.CharField(max_length=None,required=False)

   def __init__(self, *args, **kwargs):
       self.skip_place = kwargs.pop('skip_place ', False)
       super().__init__(*args, **kwargs)

   def validate_place(self,value):
     if not self.skip_place and len(value)<=0:
        raise serializers.ValidationError("Place is required.")

Upvotes: 2

uedemir
uedemir

Reputation: 1714

You can send it with including extra context.

In view;

DataSerializer(data=data, context={'skip_place': True}) # or False

In serializer;

class DataSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=None)
    place = serializers.CharField(max_length=None,required=False)

    def validate_place(self,value):
        skip_place = self.context.get("skip_place") # <- here we use self.context to get extra args
        if not skip_place and len(value)<=0:
            raise serializers.ValidationError("Place is required.")

Upvotes: 4

Related Questions