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).
Author by
Papa Sax
Updated on June 15, 2022Comments
-
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 over 8 yearsI 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?