Enviar archivos multiform | Django Rest Framework

Creé este snippet para un proyecto en el que necesitaba enviar audio a un servidor vía API REST empleando el formato multipart / form data.

views.py

En el archivo de vistas se encuentra la clase AnswerCreate, que no se encarga ni más ni menos que de crear respuestas de un examen y redirigirlas para almacenarlas debidamente en la base de datos. Dicha clase hereda de CreateAPIView, una clase genérica de DRF sobre la cuál puedes leer aquí, aunque resumiento estipula que sólo podrá ser usada para crear (ni actualizar, ni listar, etc). En nuestro queryset tenemos todas las respuestas actualmente almacenadas en la BD, y en la lista de permisos indicamos que sólo usuarios autenticados podrás crear respuestas.

En nuestra lista de parsers encontramos los necesarios para admitir cabeceras que incluyan archivos. Puedes informarte en mayor profundidad sobre los parsers de DRF aquí.

Lo que encontramos a continuación es el método perform_create sobrescrito para adaptarlo a nuestras necesidades. El resto del código, junto con los ejemplos de Postman son bastante legibles.

class AnswerCreate(generics.CreateAPIView): 
    queryset = Answers.objects.all()
    serializer_class = AnswerSerializer
    # Sólo usuarios autenticados
    permission_classes = (permissions.IsAuthenticated,)
    parser_classes = (MultiPartParser,FormParser,)
    
    def perform_create(self, serializer):
        owner = self.request.user

        # audio-answer es la <em>key</em> de la petición http
        if self.request.data.get('audio-answer') is not None:
            audio_answer = self.request.data.get('audio-answer')
            serializer.save(audio_answer = audio_answer)
        else:
            raise Exception("Al audio no pudo ser enviado")

serializers.py

class AnswerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Answers
        fields = ('id', 'student_name',)

models.py

class Answers(models.Model):
    student_name = models.TextField(default="Test student")
    audio_answer = models.FileField(upload_to='uploads')

Dejo adjuntas un par de capturas con una petición de prueba hecha en postman:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.