No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Endpoint Anidado para Appointments Usando @action

19/21
Recursos

El endpoint para agendar una cita es esencial dentro de la l贸gica de negocio, ya que permite la interacci贸n entre pacientes y doctores de manera eficiente. A trav茅s de este endpoint, un paciente puede reservar una cita con un doctor, cumpliendo con las mejores pr谩cticas de REST y utilizando un viewset anidado para aprovechar los recursos previamente creados.

驴C贸mo se estructura la URL para agendar una cita?

La URL para agendar una cita sigue una estructura anidada basada en el ID del doctor. Utilizamos el recurso existente /doctors/{id} para obtener detalles de un doctor, y sobre esta misma estructura se agregan las citas con el endpoint /appointments. Seg煤n REST, un GET en este endpoint devolver谩 una lista de citas, mientras que un POST permitir谩 crear una nueva.

驴C贸mo se implementa la acci贸n para crear una cita?

Para implementar la acci贸n, es necesario definir un m茅todo en el viewset del doctor, que maneje tanto GET como POST. El objetivo principal del POST es recibir los datos de la cita que desea agendar el usuario y crearla utilizando un Serializer. Aqu铆, el ID del doctor se obtiene de la URL, asegurando que no se pueda modificar desde el formulario.

Pasos clave:

  • Se importa el AppointmentSerializer desde el m贸dulo bookings.
  • Se recibe la data del request y se agrega el ID del doctor a dicha data.
  • Se valida la informaci贸n a trav茅s del m茅todo isValid.
  • Finalmente, se guarda la cita con Serializer.save() y se retorna un estado 201 (creado).

驴C贸mo se filtran las citas de un doctor?

Para retornar las citas de un doctor con un GET, se filtran las citas por el ID del doctor utilizando el ORM de Django. El m茅todo filter se encarga de traer todas las citas asociadas al doctor, las cuales se serializan y se devuelven en formato JSON.

驴C贸mo se valida la informaci贸n recibida?

La validaci贸n se realiza utilizando el Serializer, el cual se asegura de que los datos cumplan con las reglas establecidas. En caso de que la informaci贸n no sea v谩lida, se lanza una excepci贸n mostrando un error claro al usuario.

驴C贸mo se maneja el estado de las respuestas?

Los estados HTTP se manejan a trav茅s del m贸dulo status de Django REST. En el caso de crear una cita, se retorna un estado 201 para indicar que la cita fue creada correctamente. Para las dem谩s acciones, el estado por defecto es 200, indicando que la solicitud fue exitosa.

Aportes 4

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

por algun motivo a mi me salen todos los medicos![](https://static.platzi.com/media/user_upload/image-d7e5ddad-7750-4ef2-8b67-001972ea2da6.jpg)
**Para eliminar las citas:** ```python from rest_framework import viewsets, status from rest_framework.decorators import action from rest_framework.response import Response from rest_framework.permissions import IsAuthenticatedOrReadOnly from bookings.serializers import AppointmentSerializer from bookings.models import Appointment from .serializers import DoctorSerializer from .models import Doctor from .permissions import IsDoctor class DoctorViewSet(viewsets.ModelViewSet): serializer_class = DoctorSerializer queryset = Doctor.objects.all() permission_classes = [IsAuthenticatedOrReadOnly, IsDoctor] @action(['POST'], detail=True, serializer_class=AppointmentSerializer) def appointments(self, request, pk=None): doctor = self.get_object() if request.method == 'POST': data = request.data.copy() data['doctor'] = doctor.id serializer = AppointmentSerializer(data=data) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) if request.method == 'GET': appointments = Appointment.objects.filter(doctor=doctor) serializer = AppointmentSerializer(appointments, many=True) return Response(serializer.data) # Nuevo endpoint para eliminar una cita @action(detail=True, methods=['delete'], url_path='delete-appointment/(?P<appointment_id>[^/.]+)') def delete_appointment(self, request, pk=None, appointment_id=None): doctor = self.get_object() # Obtener el doctor por su ID try: # Intentamos obtener la cita para ese doctor y con el ID proporcionado appointment = Appointment.objects.get(id=appointment_id, doctor=doctor) appointment.delete() # Eliminar la cita return Response({"status": "Cita eliminada correctamente."}, status=status.HTTP_204_NO_CONTENT) except Appointment.DoesNotExist: return Response({"error": "Cita no encontrada."}, status=status.HTTP_404_NOT_FOUND) ```
me llama la curiosidad, no se si la clase se perdio pero hay una parte donde el muestra otras url que ya tienen actions y el dice "nos vamos abajo donde tenemos los otros actions" pero antes de esta clase no hay otra clase que lo mencione las actions de "set-on-vacation" ![](https://static.platzi.com/media/user_upload/image-c1108f4d-2fbf-4ca0-8932-11a0d31401c6.jpg)
Omg, I finish the task 馃榿: ```js @action( ["GET", "POST", "DELETE"], url_path="appointments(?:/(?P<appointment_id>[^/.]+))?", detail=True, serializer_class=AppointmentSerializer, ) def appointments(self, request, pk, appointment_id=None): doctor = self.get_object() data = request.data.copy() data["doctor"] = doctor.id if request.method == "POST": serializer = self.serializer_class(data=data) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) if request.method == "GET": appointments = Appointment.objects.filter(doctor=doctor.id) serializer = self.serializer_class(appointments, many=True) return Response(serializer.data, status=status.HTTP_200_OK) if request.method == "DELETE" and appointment_id: try: appointment = Appointment.objects.get(id=appointment_id) serializer = self.serializer_class(appointment) appointment.delete() return Response(status=status.HTTP_200_OK) except Appointment.DoesNotExist: return Response(status=status.HTTP_404_NOT_FOUND) ```