No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Aprovecha el precio especial y haz tu profesión a prueba de IA

Antes: $249

Currency
$209
Suscríbete

Termina en:

0 Días
3 Hrs
38 Min
41 Seg

Refactorizar las funciones a clases en Django REST Framework

10/21
Recursos

Refactorizar nuestras vistas basadas en funciones a vistas basadas en clases no solo mejora la organización del código, sino que también lo hace más escalable y reutilizable. En esta clase, hemos visto cómo Django REST Framework nos facilita aún más esta tarea al proporcionar vistas genéricas que reducen considerablemente la cantidad de código que tenemos que escribir manualmente.

¿Cómo refactorizar una vista basada en funciones a una basada en clases?

  • Comenzamos importando APIView desde Django REST Framework.
  • Creamos una nueva clase, heredando de APIView, donde definimos los métodos como get, post, o delete.
  • Esto nos permite organizar mejor el código y evitar los condicionales que usamos en las vistas basadas en funciones.

¿Cómo conectar la vista basada en clases con una URL?

  • Debemos importar la nueva vista en el archivo de URLs y reemplazar la vista basada en función por la basada en clase.
  • Recordemos usar el método as_view() al conectarla en el archivo de URLs.

¿Qué beneficios ofrecen las vistas genéricas en Django REST?

Las vistas genéricas permiten simplificar aún más el código, reutilizando funcionalidad ya existente en Django REST:

  • Usamos ListAPIView para simplificar una vista que solo lista elementos.
  • Usamos CreateAPIView para manejar la creación de recursos.
  • Podemos heredar de varias vistas genéricas a la vez para combinar funcionalidades, como listar y crear con pocas líneas de código.

¿Cómo funciona el QuerySet y el SerializerClass en las vistas genéricas?

  • Definimos un QuerySet para obtener los datos que queremos listar o manipular.
  • Asociamos una clase de serialización con SerializerClass para transformar los datos según las necesidades de nuestra API.
  • Esto nos permite eliminar métodos como get o post, ya que se gestionan automáticamente.

¿Cómo evitar duplicar código?

Uno de los principales objetivos al usar clases es evitar la duplicación de código. Con vistas genéricas podemos reutilizar los mismos parámetros y métodos que ya vienen implementados, logrando que el código sea más limpio y fácil de mantener.

Aportes 19

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Este profesor no Decepciona 👏👏
Un aspecto clave de Django Rest Framework es que ofrece herramientas muy útiles que simplifican el desarrollo. A diferencia de otros frameworks donde es necesario implementar muchas funcionalidades manualmente, DRF te permite optar entre hacerlo a mano o aprovechar sus características integradas. Esto facilita la creación de aplicaciones completamente personalizadas y flexibles, adaptadas a las necesidades específicas del proyecto 🐍.
Funciona solo haciendo esto... ![](https://static.platzi.com/media/user_upload/code-00c5b2b2-7aa4-44f4-b7fe-1dde43c6fc69.jpg) Es increible que hasta el pk es abstraido...... Osea, si lees este código es casi imposible, sin saber lo que pasa por debajo, que esta vista hace get/put/delete sobre un id.
Profe, realicé el cambio de las vistas basadas en funciones con la clase APIView, sin embargo, no me aparece por defecto los métodos HEAD y OPTIONS, ni siquiera el HTML form, sabes qué podría ser? O alguien más sabe qué puede ser?![](https://static.platzi.com/media/user_upload/image-3ce51bc8-8e3d-4cbe-a544-0fd3eda3e190.jpg)![](https://static.platzi.com/media/user_upload/image-55f1a8c2-9fd9-46b4-8805-6f64f59748cd.jpg)
Increíble la simplificación que se realiza
Dejo un resumen, breve, de HEAD y OPTIONS: * **HEAD**: Se utiliza cuando solo necesitas los headers de una solicitud, sin el cuerpo (por ejemplo, para verificar la existencia o propiedades de un recurso). * **OPTIONS**: Te dice qué métodos HTTP son soportados por un recurso, útil para seguridad y manejo de políticas entre dominios (CORS).
Que buen curso.
Se los dejo aquí para que lo vayan probando: ```python # Define the ListPatientsView class with allowed_methods restriction class ListPatientsView(APIView): allowed_methods = ['GET', 'POST'] # Only allow GET and POST methods # GET method to list all patients def get(self, request): patients = Patient.objects.all() # Retrieve all patients serializer = PatientSerializer(patients, many=True) # Serialize the data return Response(serializer.data) # Return the serialized data in the response # POST method to create a new patient def post(self, request): serializer = PatientSerializer(data=request.data) # Deserialize the request data serializer.is_valid(raise_exception=True) # Automatically handle validation exceptions serializer.save() # Save the new patient return Response(status=status.HTTP_201_CREATED) # Respond with 201 Created without returning the patient data ```
Con respecto al reto, mi vista quedaría de la siguiente manera: ```python class DetailPatientsView(RetrieveUpdateDestroyAPIView): allowed_methods = ['GET', 'PUT', 'DELETE'] serializer_class = PatientSerializer queryset = Patient.objects.all() ```
Tengo más de un año trabajando con Django y DRF, y el profesor explica cada detalle que hace que sea mejor que la documentación. Excelente curso.
solo me salen los metodos que tengo en allow methods, no veo ni head ni options , alguna solucion? Django==5.1.4 djangorestframework==3.15.2
Impresionante esta clase! Dos tópicos muy claros! Por un lado refactorizar. Y, en lo ultimo usar lo mejor que provee el framework con respecto a las vistas genéricas.
Cada vitsa generica tiene sus caracteristicas por ejemplo: `ListAPIView`: Solo maneja `GET` (listar una colección de objetos). * `ListCreateAPIView`: Maneja `GET` (listar objetos) y `POST` (crear nuevos objetos). * `RetrieveAPIView`: Solo maneja `GET` (obtener un objeto específico). * `RetrieveUpdateAPIView`: Maneja `GET` (obtener un objeto), `PUT` (actualización completa) y `PATCH` (actualización parcial). * `RetrieveDestroyAPIView`: Maneja `GET` (obtener un objeto) y `DELETE` (eliminar un objeto). * `RetrieveUpdateDestroyAPIView`: Maneja `GET` (obtener un objeto), `PUT` (actualización completa), `PATCH` (actualización parcial) y `DELETE` (eliminar un objeto).
si usamos las listas genericas las dos fucniones quedarian asi from rest\_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView from .models import Patient from .serializers import PatientSerializer class PatientListView(ListCreateAPIView): queryset = Patient.objects.all() serializer\_class = PatientSerializer class PatientDetailView(RetrieveUpdateDestroyAPIView): queryset = Patient.objects.all() serializer\_class = PatientSerializer las vistas genericas ya hacen todas las validaciones, la primera usa post y get y la gegunda put y delete y nos ahorramos todo el codigo de las funciones.
tanto en djando como en django reste me gusta crear todas las views uadno clases, todo es mas organizado y se mejor, a parte ya django te da casi todo.
APIView en Django REST Framework es una clase base que permite crear vistas para manejar solicitudes HTTP. Facilita la creación de endpoints al gestionar métodos como GET, POST, PUT y DELETE. Al heredar de APIView, puedes personalizar el comportamiento de las vistas, organizando mejor tu código y reutilizando lógica. Esto es especialmente útil para manejar recursos complejos en tus APIs. Además, APIView permite implementar características como autenticación y permisos, esenciales para la seguridad de tus aplicaciones.
```python class ListPatientsView(ListAPIView, CreateAPIView): allowed_methods = ['GET', 'POST'] serializer_class = PatientSerializer queryset = Patient.objects.all() class DetailPatientView(RetrieveUpdateDestroyAPIView): allowed_methods = ['GET', 'PUT', 'DELETE'] serializer_class = PatientSerializer queryset = Patient.objects.all() ```class ListPatientsView(ListAPIView, CreateAPIView):    allowed\_methods = \['GET', 'POST']    serializer\_class = PatientSerializer    queryset = Patient.objects.all() class DetailPatientView(RetrieveUpdateDestroyAPIView):    allowed\_methods = \['GET', 'PUT', 'DELETE']    serializer\_class = PatientSerializer    queryset = Patient.objects.all()
**Refactorizar** es el proceso de mejorar el código existente sin cambiar su funcionalidad externa. Esto implica reorganizar, simplificar y optimizar el código para hacerlo más legible, mantenible y eficiente, lo que facilita futuras modificaciones y reduce la probabilidad de errores.
```js class PatientListCreateAPIView(ListCreateAPIView): queryset = Patient.objects.all() serializer_class = PatientSerializer class PatientRetrieveUpdateDestroyAPIView(RetrieveUpdateDestroyAPIView): queryset = Patient.objects.all() serializer_class = PatientSerializer ```