with update relations primarykeyrelatedfield modelserializer framework foreign create django-rest-framework

update - Django Rest Framework: serializadores anidados con FileField/ImageField



nested relationships django rest framework (1)

Tengo un serializador que sigue un modelo similar a:

class Ticket: customer = Customer() ... class Customer: signature = FileField() name = CharField()

Y me gustaría utilizar los serializadores de DRF para PUBLICAR un nuevo ''Ticket'', así que envío datos multipart / form con el archivo de firma Y los datos necesarios de ''aplicación / json''.

La solicitud resultante, después de recopilar los ARCHIVOS y los DATOS, se ve así:

>>> request.FILES <MultiValueDict: {u''customer.signature'': [<InMemoryUploadedFile: signature.jpg (image/jpeg)>]}> >>> data {u''customer'': {u''name'': u''Test''}, ... } >>> serializer = TicketSerializer(data=data, files=request.FILES) >>> serializer.is_valid() False >>> serializer.errors {''customer'': [{''signature'': [u''This field is required.'']}]}

¿Cómo uso los Serializadores / Campos DRF para rellenar ImageFields / FileFields dentro de la capa ''cliente''?


Como parece que no soy el único que tiene este problema, esta fue la solución que se me ocurrió:

La respuesta más directa es tomar el campo ImageField / FileField cargado y aplicarlos en la posición adecuada con la porción anidada de ''datos'' del serializador. En mi caso, esto estaría dentro del dict ''cliente''.

Una vez que los archivos se han aplicado correctamente a los datos, podemos soltar la variable ''files ='', ya que todos los archivos están ahora incluidos en los datos.

Un ejemplo de trabajo en el código sería algo como esto:

>>> request.FILES <MultiValueDict: {u''customer.signature'': [<InMemoryUploadedFile: signature.jpg (image/jpeg)>]}> >>> data {u''customer'': {u''name'': u''Test''}, ... } if ''customer.signature'' in request.FILES: data[''customer''][''signature_file''] = request.FILES[''customer.signature''] >>> serializer = TicketSerializer(data=data) >>> serializer.is_valid() True