framework example español create python django serialization django-rest-framework django-serializer

python - example - django rest framework post



Excluir dinámicamente o incluir un campo en el serializador de framework REST de Django (2)

¿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 pruébalo.

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.


Crear un nuevo serializador es el camino a seguir. Al eliminar los campos de manera condicional en un serializador, agrega complejidad adicional y hace que el código sea más difícil de diagnosticar rápidamente. Deberías 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 una pregunta sin TomoView, pero con un campo adicional.

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