Django,DRF:仅在第一页上删除序列化程序的特定字段

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

如何只删除第一页上的 field3field4? 我需要一些可以动态重用的东西,因为我打算在多个视图中使用它。

如何在不创建多个序列化程序的情况下动态删除 field3field4

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

您可以编写两个不同的序列化程序,第一个带有 field3field4,另一个不包含这两个字段。然后根据您的观点,使用 get_serializer_class() 方法 select 为提供的 page.

提供适当的序列化程序

你的观点中需要这样的东西 -

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

尝试使用序列化程序上下文。通过这种方式,您可以在序列化程序方法中评估请求数据和参数,例如 to_representation 这对您的情况很有用。 PS。这段代码是用Whosebug写的window,可能有一些错误,但它展示了一种方法

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}