Dynamically modifying serializer fields in Django Rest Framework

13,258

Note that you are setting serializer_class not to a class, but to an instance of the class. You either need to set dropfields as an attribute on the class, (just like it does for fields in the documented example you link to) or you need to look at overriding the get_serializer method of the viewset (docs).

Share:
13,258
Papa Sax
Author by

Papa Sax

Updated on June 15, 2022

Comments

  • Papa Sax
    Papa Sax almost 2 years

    I'm trying to use the Advanced serializer usage described in the django rest framework documentation. http://django-rest-framework.org/api-guide/serializers.html#advanced-serializer-usage to dynamically modifying serializer field

    Here is my serializer class:

    class MovieSerializer(serializers.ModelSerializer):
        moviework_work = MovieWorkSerializer(many=True) 
    
        def __init__(self, *args, **kwargs):
            # Don't pass the 'fields' arg up to the superclass
            dropfields = kwargs.pop('dropfields', None)
    
            # Instantiate the superclass normally
            super(MovieSerializer, self).__init__(*args, **kwargs)
    
            if dropfields:
                # Drop fields specified in the `fields` argument.
                banished = set(dropfields)
                for field_name in banished:
                    self.fields.pop(field_name)
        class Meta:
            model = Movie
            fields = ('field1','field2','moviework_work')
    

    Here is my viewset

    class MovieFromInterpreterViewSet(viewsets.ModelViewSet):
        queryset = Movie.objects.all()
        serializer_class = MovieSerializer(dropfields=('moviework_work',))
    

    I get this error:

    TypeError: 'MovieSerializer' object is not callable
    
  • ePascoal
    ePascoal over 8 years
    I understand that serializer_class is not a class but I can't understand this answer since that the links seems to be outdated. Can you update the links? or give an example attending to the question posted?