How to dynamically remove fields from serializer output

FVod picture FVod · Jun 23, 2016 · Viewed 14k times · Source

I'm developing an API with Django Rest framework, and I would like to dynamically remove the fields from a serializer. The problem is that I need to remove them depending on the value of another field. How could I do that? I have a serializer like:

class DynamicSerliazer(serializers.ModelSerializer):
    type = serializers.SerializerMethodField()
    url = serializers.SerializerMethodField()
    title = serializers.SerializerMethodField()
    elements = serializers.SerializerMethodField()

    def __init__(self, *args, **kwargs):
        super(DynamicSerliazer, self).__init__(*args, **kwargs)
        if self.fields and is_mobile_platform(self.context.get('request', None)) and "url" in self.fields:
            self.fields.pop("url")

As you can see, I'm already removing the field "url" depending whether the request has been done from a mobile platform. But, I would like to remove the "elements" field depending on the "type" value. How should I do that?

Thanks in advance

Answer

Rahul Gupta picture Rahul Gupta · Jun 23, 2016

You can customize the serialization behavior by overriding the to_representation() method in your serializer.

class DynamicSerliazer(serializers.ModelSerializer):

    def to_representation(self, obj):
        # get the original representation
        ret = super(DynamicSerializer, self).to_representation(obj)

        # remove 'url' field if mobile request
        if is_mobile_platform(self.context.get('request', None)):
            ret.pop('url')

        # here write the logic to check whether `elements` field is to be removed 
        # pop 'elements' from 'ret' if condition is True

        # return the modified representation
        return ret