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()