Modelo de calendario Django
Estoy creando una aplicación de citas médicas con Django y Django Rest Framework. La aplicación tendrá la funcionalidad para que las secretarias agreguen citas al calendario de un médico, y cada médico puede tener más de una clínica (y varias secretarias).
Construí este Calendarmodelo para almacenar la información de disponibilidad de un médico, que básicamente necesita informar:
- en un día determinado, a qué hora comienza y termina el trabajo el médico
- en un día determinado, a qué hora el médico comienza y termina su tiempo de descanso (si lo hace).
¿Es esta la forma óptima de hacerlo?
class Calendar(models.Model):
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE, related_name="appointments")
clinic = models.ForeignKey(Clinic, on_delete=models.CASCADE, related_name="appointments")
monday_start = models.TimeField()
monday_end = models.TimeField()
monday_break_start = models.TimeField()
monday_break_end = models.TimeField()
# continues for every single day of the week
Respuestas
Esta es una solución relativamente simple que tiene aquí y, en teoría, podría funcionar, pero en mi experiencia, en una palabra real, necesita algo más flexible. Además, no piensa en la redundancia de los datos.
¿Qué pasa si un médico, por ejemplo, trabaja solo un día a la semana? La mayoría de las columnas estarían vacías. ¿O si un médico puede trabajar solo por la mañana? Entonces no habría break_start o end en ninguno de los campos del calendario. ¿Y si, por ejemplo, el médico trabaja cada dos semanas? Entonces no tendrá una forma fácil de almacenar esta información. Además, habría mucha información redundante. Si tiene a cada médico trabajando de 8:00 a. M. A 4:00 p. M., Tendrá estos datos almacenados allí de forma redundante. Se necesita mucho menos espacio, si puede almacenar dicha información como una relación con algún tipo de registro de duración.
Si yo fuera usted, crearía un diseño más genérico en el que puede almacenar hasta 365 registros (para cada día del año), para cada calendario. Entonces cada día tendría una relación con una lista de intervalos, que luego podrían ser de actividad requerida. De esa manera terminaría con un diseño más flexible .
El borrador podría verse así:
class Calendar(models.Model):
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)
clinic = models.ForeignKey(Clinic, on_delete=models.CASCADE)
class CalendarDay(models.Model):
date = model.DateField()
calendar = models.ForeignKey(Calendar, on_delete=models.CASCADE)
class TimeInterval(models.Model):
activity = models.Integer(choices = [(1, 'Working'), (2,'Lunch Break'), (3, 'Afternoon Break') ...])
start = models.TimeField()
end = models.TimeField()
calendar_day = models.ForeignKey(CalendarDay, on_delete=models.CASCADE)
Para garantizar la integridad de los datos , puede agregar una restricción única en la combinación de columnas de fecha y calendario en la tabla CalendarDay. De esa manera, cada calendario puede tener solo un registro para una fecha particular en la tabla CalendarDay.