Excluir o incluir dinámicamente un campo en el serializador de marco REST de Django

Tengo un serializador en el marco REST de Django definido de la siguiente manera:

class QuestionSerializer(serializers.Serializer): id = serializers.CharField() question_text = QuestionTextSerializer() topic = TopicSerializer() 

Ahora tengo dos vistas API que usan el serializador anterior:

 class QuestionWithTopicView(generics.RetrieveAPIView): # I wish to include all three fields - id, question_text # and topic in this API. serializer_class = QuestionSerializer class QuestionWithoutTopicView(generics.RetrieveAPIView): # I want to exclude topic in this API. serializer_class = ExamHistorySerializer 

Una solución es escribir dos serializadores diferentes. Pero debe haber una solución más fácil para excluir condicionalmente un campo de un serializador dado.

¿Has probado esta técnica?

 class QuestionSerializer(serializers.Serializer): def __init__(self, *args, **kwargs): remove_fields = kwargs.pop('remove_fields', None) super(QuestionSerializer, self).__init__(*args, **kwargs) if remove_fields: # for multiple fields in a list for field_name in remove_fields: self.fields.pop(field_name) class QuestionWithoutTopicView(generics.RetrieveAPIView): serializer_class = QuestionSerializer(remove_fields=['field_to_remove1' 'field_to_remove2']) 

Si no, una vez que lo intente.

Crear un nuevo serializador es el camino a seguir. Al eliminar condicionalmente los campos en un serializador, usted agrega complejidad adicional y hace que su código sea más difícil de diagnosticar rápidamente. Debe tratar de evitar mezclar las responsabilidades de una sola clase.

Seguir los principios básicos de diseño orientado a objetos es el camino a seguir.

QuestionWithTopicView es un QuestionWithoutTopicView pero con un campo adicional.

 class QuestionSerializer(serializers.Serializer): id = serializers.CharField() question_text = QuestionTextSerializer() topic = TopicSerializer() class TopicQuestionSerializer(QuestionSerializer): topic = TopicSerializer()