如何只在第一页删除
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
尝试使用序列化器上下文。通过这种方式,您可以在序列化程序方法中评估请求数据和参数,例如
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}
您可以编写两个不同的序列化程序,第一个带有
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
尝试从查询集中删除它们,并使用 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}