Home > other >  Django, DRF: To remove a specific field of the serializer only on the first page
Django, DRF: To remove a specific field of the serializer only on the first page

Time:01-25

How can I remove field3 and field4 only on the first page? I need something that can be dynamically reused as I plan to use it in multiple views.

How can I dynamically delete field3 and field4 without creating multiple serializers?

class CustomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Model
        fields = ('field', 'field2', 'field3', 'field4')


class CustomSerializer2(serializers.ModelSerializer):
    class Meta:
        model = Model
        fields = ('field5', 'field6', 'field3', 'field4')


class CustomSerializer2(serializers.ModelSerializer):
    class Meta:
        model = Model
        fields = ('field7', 'field8', 'field3', 'field4')


class CustomView(ListAPIView):
    serializer_class = CustomSerializer

class CustomView2(ListAPIView):
    serializer_class = CustomSerializer2

class CustomView3(ListAPIView):
    serializer_class = CustomSerializer3

CodePudding user response:

You can write two different serializers the first one with field3 & field4 and other one does not include these two fields. Then from your views use get_serializer_class() method to select the appropriate serializer for the provided page.

You will need some thing like this in your views -

class CustomSerializerWithFields(serializers.ModelSerializer):
    class Meta:
        model = Model
        fields = ('field', 'field2', 'field3', 'field4')

class CustomSerializerWithoutFields(serializers.ModelSerializer):
    class Meta:
        model = Model
        fields = ('field', 'field2')

class CustomView(ListAPIView):
    def get_serializer_class(self):
        if self.request.query_params["page"]==1:
            return CustomSerialierWithoutFields
        return CustomSerializerWithFields

CodePudding user response:

Try using serializer context. This way you can assess request data and params in you serializer methods such as to_representation which is useful in your case. PS. This code was written in stackoverflow window, it may include some mistakes, but it shows an approach

class CustomView(ListAPIView):
    def get_serializer(self, *args, **kwargs):
        serializer_class = self.get_serializer_class()
        kwargs['context'] = {'request': self.request}
        return serializer_class(*args, **kwargs)

class CustomSerializer2(serializers.ModelSerializer):
    class Meta:
        model = Model
        fields = ['field1', 'field2', 'field3']
    
    def to_representation(self, instance, **kwargs):
        if self.context.get('request').query_params.get('page') == 1:
            return {'field1': instance.field1, 'field2': instance.field2}
        return {'field1': instance.field1, 'field3': instance.field3}
  •  Tags:  
  • Related