Crear API endpoint con Django Rest Framework que permita json-array

willy_chaos

Hola a todos, pues estoy creando una API con Django Rest Framework y me encuentro en la casuistica de que necesitaria crear un endpoint donde poder enviar un json que contiene un array de items.

La idea es que en el backend antes de guardar el nuevo array, se haga un borrado completo de los datos anteriores que hay en la base de datos, pero estoy teniendo dificultades para conseguirlo.

urls.py

urlpatterns= [
 ...
 path('api/v1/dhcphosts-uall/',csrf_exempt(DHCPHostUpdateAll) 
]

serializers.py

class DHCPHostSerializer(serializers.ModelSerializer):
    class Meta:
        model = DHCPHost
        fields = ('__all__')

views.py

class DHCPHostUpdateAll(viewsets.ModelViewSet):
    serializer_class = DHCPHostSerializer
    def post(self,request):
        data = self.request.data
        if isinstance(data,list):
            serializer = self.get_serializer(data=self.request.data,many=True)
        else:
            serializer = self.get_serializer(data=self.request.data)
            for item in self.request.data:
                print("ITEM: "+str(item))
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)

El problema es que entonces me dice que en el

<tr>
    <th>Exception Value:</th>
    <td>
     <pre>__init__() takes 1 positional argument but 2 were given</pre>
    </td>
   </tr>
   <tr>
    <th>Exception Location:</th>
    <td><span class="fname">/Users/usuario/PycharmProjects/proyecto/venv/lib/python3.9/site-packages/django/views/decorators/csrf.py</span>,
     line 54, in wrapped_view</td>

Y si no le pongo el csrf_exempt entonces me suelta un mensaje de que paso hacia adelante porque no se cumple el CSRF...

Teneis algun ejemplo de como hacer lo que indico?

Desde un cliente mediante API enviar un listado JSON por POST para guardar los datos en la DB.

aren-pulid0

Si no me equivoco te falta el .as_view()

urlpatterns= [
 ...
 path('api/v1/dhcphosts-uall/',csrf_exempt(DHCPHostUpdateAll.as_view()) 
]

Estas utilizando una vista basada en clase, por tanto has de utilizar ese método para poder utilizarla o usar un router de los que trae drf

willy_chaos

nada al final esta mañana lo he conseguido, luego subire el codigo.

la version que tengo es la ultima 3.1.5 no parece que le tenga que poner el as_view() cosa que en django normal si que lo he tenido que poner en otras versiones

Usuarios habituales

  • willy_chaos
  • aren-pulid0