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!