Construye y valida datos clínicos en Django con confianza: crea modelos sólidos y serializers en Django REST Framework para transformar entre modelos y JSON con precisión. Este contenido guía, paso a paso, desde el diseño del dominio hasta las pruebas en shell, optimizado para proyectos tipo Doctor App.
¿Cómo organizar modelos y apps en Django?
Una organización clara del dominio acelera el desarrollo y reduce errores. Django permite separar el proyecto en múltiples apps para aislar responsabilidades y facilitar relaciones entre modelos.
¿Qué entidades y relaciones requiere la app?
Patients: Patient, Insurance y Medical Record. Representan paciente, seguro y la historia clínica con campos como diagnóstico, tratamiento y seguimiento.
Doctors: Doctor, Department, Doctor Availability y Medical Note. Incluyen datos personales, biografía, dirección y disponibilidad con inicio y fin.
Bookings: Appointment. Centraliza la información de la cita y se relaciona con paciente y doctor; puede incluir una nota médica.
Relaciones entre apps: Appointment importa Patient y Doctor para establecer referencias.
Idea clave: cada tabla modela una parte del dominio y se conecta con las demás donde corresponde.
Registra en INSTALLED_APPS para activar modelos y migraciones.
¿Dónde registrar installed apps y por qué importa?
Añadir patients, doctors y bookings en INSTALLED_APPS habilita sus modelos para migraciones y serializers.
Sin registro, no hay migraciones ni acceso al ORM.
¿Cómo crear serializers con Django REST Framework?
Los serializers conectan el modelo con el mundo exterior. Convierten modelo → JSON y JSON → modelo usando reglas de validación definidas en los modelos. La forma más directa es usar ModelSerializer con Meta.model y Meta.fields.
¿Cómo definir un ModelSerializer con fields='all'?
En cada app, crea serializers.py e importa DRF y el modelo.
from rest_framework import serializers
from models import Patient
classPatientSerializer(serializers.ModelSerializer):classMeta: model = Patient
fields ='__all__'
Clave: fields = 'all' incluye todos los campos del modelo en el serializer.
Repite la clase para Insurance y Medical Record, cambiando el modelo en Meta.
¿Cómo probar un serializer en la shell?
Ejecuta migraciones antes de probar para asegurar el esquema en la base de datos.
Importa el serializer, crea un diccionario estilo JSON, instancia y valida.
from patients.serializers import PatientSerializer
data ={"first_name":"Luis","last_name":"Martínez"}serializer = PatientSerializer(data=data)serializer # inspección rápida para depuraciónserializer.is_valid()# False si faltan campos requeridosserializer.errors # muestra qué campos son obligatorios
Idea clave: is_valid() aplica las mismas reglas de los modelos. Si en los modelos no marcaste campos como opcionales, el serializer exigirá todos.
¿Qué errores comunes revelan los serializers?
Campos requeridos ausentes como fecha de nacimiento o contacto.
Tipos no compatibles con el modelo.
Solución: completar los campos requeridos o ajustar opciones en el modelo si corresponde.
¿Qué comandos y prácticas aceleran el flujo de trabajo?
Adoptar una rutina clara permite iterar más rápido y detectar problemas temprano.
¿Qué pasos mínimos garantizan coherencia?
Crear apps por dominio: patients, doctors, bookings.
Registrar todas las apps en INSTALLED_APPS.
Copiar y revisar modelos antes de migrar.
Ejecutar makemigrations y migrate en cada cambio del esquema.
¿Cómo estandarizar la creación de serializers?
Archivo serializers.py por app.
Usar ModelSerializer con Meta.model y Meta.fields.
Duplicar clases para variantes como Insurance y Medical Record, cambiando solo el modelo.
¿Cómo validar de extremo a extremo rápidamente?
Probar en shell con datos de ejemplo.
Inspeccionar el objeto del serializer para depurar.
Usar is_valid() y errors para entender validaciones.
Crear más datos de prueba para Appointment, Doctor y relaciones.
¿Te gustaría ver más ejemplos de validación o casos de relaciones entre apps? Comparte tus dudas en los comentarios y cuéntanos qué parte del flujo quieres profundizar.
No sé si lo enseñan en una clase posterior, pero no es una buena práctica usar __all__ porque podrías estar exponiendo información sensible lo mejor seria colocar solo los datos que deseas mostrar por el json desde el serializador, además los serializadores también tienen métodos como create, update, destroy con los que se puede crear lógica de validaciones y muchas más cosas
buen punto a tomar en cuenta
Aunque es un buen punto para tener en cuenta, es un poco práctico utilizar el all, en aplicaciones productivas siempre es recomendable hacer un buen code review
Dejo un serializador de Patient a modo de ejemplo:
from rest_framework importserializersfrom.modelsimportPatientclassPatientSerializer(serializers.ModelSerializer):classMeta: model =Patient fields =['id','first_name','last_name','date_of_birth','contact_number','email','address','medical_history']
Hola cibernauta. Te comparto mi experiencia para que no pases por lo mismo, si estás trabajando en Windows aplica los siguientes comandos desde la terminal de visual code.
python manage.py startapp patients
python manage.py startapp doctors
python manage.py startapp bookings
Esto te permitirá crear los directorios de los módulos.
<u>¡Importante!</u>
Si tienes problema con el venv asegúrate revisar las variables de entorno que tienes en Windows.
Solo recuerda: "Sigue intentándolo, continúa practicando y por sobre todo no pares de aprender. "
De donde salieron las carpetas con los archivos "doctors", "patients" ?
Se crean al ejecutar estos comandos para crear apps:
Profe, veo que te faltó relacionar el modelo de Doctor con el modelo de Department. En el diagrama ER tenías una relación entre ellos pero, no la definiste al momento de crear los modelos.
Las relaciones de las tablas quedarían así.
booking
from rest_framework import serializers
from.models import Appointment, MedicalNote
classAppointmentSerializer(serializers.ModelSerializer):classMeta: model = Appointment
fields ='__all__'classMedicalNoteSerializer(serializers.ModelSerializer):classMeta: model = MedicalNote
fields ='__all__'
doctors
from rest_framework import serializers
from.models import Doctor, Department, DoctorAvailability, MedicalNote
classDoctorSerializer(serializers.ModelSerializer):classMeta: model = Doctor
fields ='__all__'classDepartmentSerializer(serializers.ModelSerializer):classMeta: model = Department
fields ='__all__'classDoctorAvailabilitySerializer(serializers.ModelSerializer):classMeta: model = DoctorAvailability
fields ='__all__'classMedicalNoteSerializer(serializers.ModelSerializer):classMeta: model = MedicalNote
fields ='__all__'
patients
from rest_framework importserializersfrom.modelsimportPatient,Insurance,MedicalRecordclassPatientSerializer(serializers.ModelSerializer):classMeta: model =Patient fields ='__all__'classInsuranceSerializer(serializers.ModelSerializer):classMeta: model =Insurance fields ='__all__'classMedicalRecordSerializer(serializers.ModelSerializer):classMeta: model =MedicalRecord fields ='__all__'```from rest\_framework import serializersfrom .modelsimportPatient,Insurance,MedicalRecordclassPatientSerializer(serializers.ModelSerializer):classMeta: model =Patient fields ='\_\_all\_\_'classInsuranceSerializer(serializers.ModelSerializer):classMeta: model =Insurance fields ='\_\_all\_\_'classMedicalRecordSerializer(serializers.ModelSerializer):classMeta: model =MedicalRecord fields ='\_\_all\_\_'
Un serializador en Django REST Framework es una herramienta que convierte datos complejos, como instancias de modelos de Django, en formatos nativos de Python, como diccionarios, y luego a JSON para la comunicación en APIs. Su función es transformar datos entre el formato que utilizan los modelos y el formato que se envía o recibe a través de las solicitudes HTTP. Esto permite validar y manipular la información de manera eficiente en aplicaciones web.
buen dia deberias minimizar tu terminal, es una recomendación
Gracias por la recomendación, Lo tendré en cuenta para futuros cursos
Buenas tardes profesor, mi inquietud es saber la diferencia en usar la clase ModelSerializer en vez de la que sugiere la documentacion que es HyperlinkedModelSerializer, ya que menciona que es un buen diseño el usarla
La diferencia entre las dos es que en una vamos a tener links y estos links son útiles en el momento de utilizar la API.
Para efectos prácticos utilice el más simple pronto código lo puedes cambiar!
Quede muy impresionado con la manera de testear el serializer de python :o
Un serializer en Django Rest Framework es una herramienta fundamental que permite convertir objetos complejos, como instancias de modelos de Django, en formatos de datos simples y fácilmente transferibles, como JSON o XML.
Además de facilitar la conversión de datos, los serializers también validan la información entrante, asegurando que cumpla con los requisitos esperados antes de ser procesada o almacenada.
Esto no solo simplifica la comunicación entre el servidor y el cliente, sino que también garantiza la integridad y seguridad de los datos manejados en la aplicación.
como puedo crear un panel de administrador
El panel de administración de Django es una joya que ya viene incluida, no tienes que construirla desde cero. Es la interfaz que te permite gestionar tus modelos sin escribir una sola línea de código extra.
¿Ya ejecutaste el comando createsuperuser en tu terminal para configurar tu acceso inicial?
ERROR importacion circular
Al crear las migraciones obtuve el siguiente error
ImportError: cannot import name 'Doctor' from partially initialized module 'doctors.models' (most likely due to a circular import) (/home/sabina-cano/Documentos/proyectosDjango/Curso de Django Rest Framework/doctors/models.py)
SOLUCION :
Regla práctica en Django
Cuando uses:
ForeignKey
ManyToManyField
OneToOneField
entre apps diferentes, muchas veces es mejor usar:
'app.Modelo'
en lugar de importar el modelo directamente.
Django resuelve la relación automáticamente al iniciar el proyecto y evitas importaciones circulares.
buenas tardes spy novato y quiero desarrollar una app web para inventarios de herramientas y equipos de computo me pueden guir como hacerlo gracias
Te recomiendo que hagas los siguientes cursos:
Python
Django
Django Rest
gracias
una pregunta
¿no debería haber una relación entre paciente y doctor? no debería haber en Appointment un id para el doctor y el Paciente?
Es el Appoinment que los relaciona indirectamente. Lo extraño es que hayan dos MedicalNote.
Eso también me llamó la atención, seguro más adelante se aclara esa redundancia
Hay cosas incorrectas que veo.
El OneToOneField. un paciente tiene un seguro.
el Patient es la entidad fuerte, existe sin haber Insurance, la cual es la entidad débil. Por tanto, la referencia a Patient en Insurance es incorreta.
Apenas llevo casi 4 minutos de video y pues ya van dos problemas.
Nice:
🟢 Estructura de un serializer
Los serializadores permiten que datos complejos, como querysets e instancias de modelos, se conviertan en tipos de datos nativos de Python que luego pueden ser fácilmente transformados en JSON, XML u otros tipos de contenido.
Una estructura básica es la siguiente:
from datetime import datetime
classComment:def__init__(self, email, content, created=None): self.email = email
self.content = content
self.created = created or datetime.now()comment = Comment(email='leila@example.com', content='foo bar')
Espero haberte ayudado. ¡Nunca pares de aprender! 🚀🚀