Django Rest - Back-End

Django REST es un framework podersos y flexible con herramientas para la creacion APIs web.
Su funcion es de modelo de comunicación entre el frontend y el backend.
Lo importante es que el cliente no recibe HTML para renderizar, sino simplemente los datos que se han generado como respuesta. Es decir, el servidor no escribe HTML, sino únicamente genera los datos para enviarlos al cliente.

¿Que es REST?

REST deriva de «REpresentational State Transfer» (transferencia de representación de estado). Un servicio REST no tiene estado, el servicio pierde todos sus datos entre llamadas. Esto es, que no se puede llamar a un servicio REST y pasarle unos datos (p. ej. un usuario y una contraseña) y esperar que “nos recuerde” en la siguiente petición.
De ahí el nombre: el estado lo mantiene el cliente y por lo tanto es el cliente quien debe pasar el estado en cada llamada. Si quiero que un servicio REST me recuerde, debo pasarle quien soy en cada llamada.

¿Porque lo utilizamos?

Separación cliente/servidor e Independecia de tecnologias
Estos se comunican con un lenguaje de intercambio (JSON,XML,…) y podemos hacer varios Front-End (Web, Mobile, etc) con un único Back-End. Todo reciben los datos de la misma manera y cada uno decide que hacer con ellos.

Estructura basica

DRF se basa fundamentalmente en 3 componentes: los serializadores, las vistas y los routers.

Los serializadores

Asociado a los modelos. Nos permiten definir al detalle cómo serán las respuestas que devolverá nuestro API y cómo procesaremos el contenido de las peticiones que nos lleguen.

Los atributos, de la clase AddressSerializer, que estan en fields= son los elegidos que API puedo manejar:

class AddressSerializer(serializers.ModelSerializer):
class Meta:
    model=Address
    fields=('alias','address','floor','phone','st_number','zip_code','city','locality')

Los routers

Son una herramienta que nos permiten definir las urls de nuestro API de una manera sencilla y ordenada. Nos permiten definir qué método (GET, POST, PUT,…) se ejecutará al llegar una petición HTTP contra un path concreto.
router.register(r'city', CityViewSet,base_name="city")

Hace referencia a un ViewSet, para que se pueda acceder a el con una URL.

"city": "http://127.0.0.1:8000/rest/city/",

Las views

Extensiones de las class-view de django. Sirva para simplificarnos la union de los routers, los serializadores y los modelos. Como respuesta devuelve json, xml, etc.

Ejemplo:

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer

    @action(methods=['GET','DELETE'], detail=True)
    def delete(self, request, pk, format=None):
        object=Product.objects.get(pk=pk)
        object.delete()
        return redirect("../../")
ProductViewSet relaciona todos los objetos de la clase Product en un queryset: queryset = Product.objects.all() y la serializacion de ese modelo serializer_class = ProductSerializer en un clase.
La funcion delete, toda la Primary Key pk y la utiliza para borrar el objeto especifico de la base de datos, object.delete().