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

问题描述 投票:0回答:3

如何只在第一页删除

field3
field4
? 我需要一些可以动态重用的东西,因为我打算在多个视图中使用它。

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

field3
field4

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
django django-rest-framework
3个回答
1
投票

尝试使用序列化器上下文。通过这种方式,您可以在序列化程序方法中评估请求数据和参数,例如

to_representation
这对您的情况很有用。 附言。这段代码是在stackoverflow窗口写的,可能有一些错误,但它展示了一种方法

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}

0
投票

您可以编写两个不同的序列化程序,第一个带有

field3
field4
,另一个不包括这两个字段。然后从您的视图中使用
get_serializer_class()
方法为提供的
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

0
投票

尝试从查询集中删除它们,并使用 to_representation 从序列化程序中删除空字段


    class CustomSerializer
        class Meta:
            model = Model
            fields = '__all__'
          
        def to_representation(self, instance):
            rep = super().to_representation(instance)
            return {k: v for k, v in rep.items() if v is not None}

© www.soinside.com 2019 - 2024. All rights reserved.