es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Formato de datos de Django APIView desde AJAX

Estaba intentando enviar un array de objetos en el archivo views.py utilizando APIView para insertar múltiples filas en 1 solicitud de publicación. Esta es mi estructura de datos en JavaScript:

const data = {
    group_designation: [
        {id: 1},
        {id: 2},
        {id: 3},
    ]
}

Utilizo una aplicación llamada Insomnia y solo acepta este tipo de formato:

{
    "group_designation": [
        {"id": 1},
        {"id": 2},
    ]
}

Sin embargo, si envío una solicitud de publicación utilizando el formato de JavaScript mencionado anteriormente, me da un error de solicitud incorrecta (400). Este es el payload en la pestaña de la red:

group_designation[0][id]: 1
group_designation[1][id]: 2
group_designation[2][id]: 3

En Django, este es el resultado de request.data:

<querydict: {="" 'group_designation[0][id]':="" ['1'],="" 'group_designation[1][id]':="" ['2'],="" 'group_designation[2][id]':="" ['3']="" }="">

Mi código en Django:

def post(self, request):
    temp_objects = []
    new_data_format = {'group_designation': temp_objects}

    serializer = GroupSerializer(data=new_data_format, many=True)
    if serializer.is_valid(raise_exception=True):
        group_data_saved = serializer.save()

    return Response({
        "success": "success!!!"
    })

Simplemente estaba intentando reescribir el formato de datos para que se guarde, pero no tuve suerte. Por favor ayudenme. ¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la forma en que los datos se envían en la carga útil. El formato de JavaScript const data = { group_designation: [{id: 1}, {id: 2}, {id: 3}] } no es aceptado por la API, en su lugar, la carga útil se envía en el formato group_designation[0][id]: 1, lo cual está causando un error de solicitud incorrecta.

    Una forma de resolver este problema es modificar el formato de JavaScript para que coincida con el formato JSON que es aceptado por la API. El formato modificado sería:

    const data = {
      "group_designation": [
        {"id": 1},
        {"id": 2},
        {"id": 3}
      ]
    }
    

    Este formato JSON debería ser aceptado por la API y la carga útil se enviará en el formato correcto.

    Alternativamente, si modificar el formato de JavaScript no es una opción, se podría modificar la vista de Django para analizar los datos enviados en la carga útil y convertirlos al formato esperado. Para lograr esto, se podría recorrer cada par de clave-valor en el QueryDict request.data y construir el diccionario new_data_format de acuerdo.

    Aquí hay un ejemplo de implementación:

    def post(self, request):
        temp_objects = []
    
        # Recorrer cada par de clave-valor en request.data
        for key, value in request.data.items():
            # Verificar si la clave comienza con 'group_designation'
            if key.startswith('group_designation'):
                # Extraer el índice de la cadena de la clave
                index = int(key.split('[')[1].split(']')[0])
    
                # Crear un nuevo objeto con el valor 'id'
                obj = {'id': int(value[0])}
    
                # Agregar el objeto a la lista temp_objects en el índice correcto
                if index >= len(temp_objects):
                    temp_objects.append(obj)
                else:
                    temp_objects[index] = obj
    
        # Construir el diccionario new_data_format
        new_data_format = {'group_designation': temp_objects}
    
        serializer = GroupSerializer(data=new_data_format, many=True)
        if serializer.is_valid(raise_exception=True):
            group_data_saved = serializer.save()
    
        return Response({
            "success": "¡éxito!"
        })
    

    Esta implementación debería ser capaz de analizar la carga útil enviada en el formato incorrecto y convertirla al formato esperado para que el serializador funcione correctamente.

Comments are closed.