Django,DRF:仅在第一页上删除序列化程序的特定字段
Django, DRF: To remove a specific field of the serializer only on the first page
如何只删除第一页上的 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
您可以编写两个不同的序列化程序,第一个带有 field3
和 field4
,另一个不包含这两个字段。然后根据您的观点,使用 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}
如何只删除第一页上的 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
您可以编写两个不同的序列化程序,第一个带有 field3
和 field4
,另一个不包含这两个字段。然后根据您的观点,使用 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}