modelviewset framework example español createapiview coreapi con apiview django django-rest-framework

framework - Cargar un archivo con el marco REST de Django ListCreateAPIView



django rest framework español (1)

Creo que el problema está en su clase de serializador donde define el campo del modelo de image como Field . El Field genérico es de solo lectura, por lo que puede ser la fuente del problema. Intente simplemente eliminar eso de su serializador, ya que no es necesario:

class PhotoSerializer(serializers.ModelSerializer): class Meta: model = Photo

Espero que esto ayude, hágame saber cómo se llevan bien.

Al usar el ListCreateAPIView genérico ListCreateAPIView Django REST, creé un punto final que creo que debería poder cargar fotos mediante solicitudes POST. Estoy modelando mi código en este tutorial .

Hasta ahora, he intentado enviar un archivo a este punto final usando Android y curl, y observé el mismo comportamiento: se crea un nuevo registro, pero el archivo no está adjunto. Como el archivo es un campo obligatorio, el servidor devuelve un error 500.

Esta pregunta es similar, pero él no está utilizando las vistas genéricas del marco REST y no estoy seguro de por qué ... Me gustaría aprovecharlas cuando corresponda.

Aquí está mi vista de Django:

class PhotoList(generics.ListCreateAPIView): model = Photo serializer_class = PhotoSerializer permission_classes = [ permissions.AllowAny ]

...mi modelo:

def get_unique_image_file_path(instance=None, filename=''dummy.jpg''): """ function to determine where to save images. assigns a uuid (random string) to each and places it in the images subdirectory below media. by default, we assume the file is a .jpg """ ext = filename.split(''.'')[-1] filename = "%s.%s" % (uuid.uuid4(), ext) # TODO: ''images'' is hard coded return os.path.join(''images'', filename) class Photo(models.Model): post = models.ForeignKey(Post, related_name=''photos'', null=True, blank=True) image = models.ImageField(upload_to=get_unique_image_file_path) def get_image_abs_path(self): return os.path.join(settings.MEDIA_ROOT, self.image.name)

... y mi serializador:

class PhotoSerializer(serializers.ModelSerializer): image = serializers.Field(''image.url'') class Meta: model = Photo

Reproduciendo el error

Para generar el comportamiento, PUESTO en el servidor utilizando el siguiente comando curl (sucede exactamente lo mismo con mi código de cliente Android):

curl --form image=@test_image.jpg http://localhost:8000/rest_tutorial/photos

Al examinar generics.ListCreateAPIView , el método create() se ve así:

# Copied from rest_framework.mixins.CreateModelMixin def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.DATA, files=request.FILES) if serializer.is_valid(): self.pre_save(serializer.object) self.object = serializer.save(force_insert=True) self.post_save(self.object, created=True) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

A medida que paso por el código anterior en el depurador de PyCharm, puedo ver claramente mi archivo en el campo init_files serializer.get_serializer() después de serializer.get_serializer() . Sin embargo, el campo de object del serializador tiene un montón de tracebacks pero no referencias a mi archivo de imagen. Tal vez algo está mal aquí?

Después de self.object = serializer.save(force_insert=True) el registro se crea con un campo de imagen vacío, el archivo no se carga y self.object.image.file solo contiene un traceback que hace referencia a un ValueError .

¿Algunas ideas? ¡Gracias!