Модель календаря Django
Я создаю приложение для записи к врачу с помощью Django и Django Rest Framework. Приложение будет иметь функции, позволяющие секретарям добавлять встречи в календарь врача, и у каждого врача может быть несколько клиник (и несколько секретарей).
Я построил эту Calendarмодель для хранения информации о доступности врача, которая должна в основном информировать:
- в определенный день, когда врач начинает и заканчивает работу
- в какой день врач начинает и заканчивает перерыв (если они это делают).
Это оптимальный способ сделать это?
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
Ответы
Это относительно простое решение, которое у вас есть, и оно может теоретически работать, но, по моему опыту, вам нужно что-то более гибкое. И не думаешь о избыточности данных.
Что, если врач, например, работает только один день в неделю. Тогда большинство столбцов будут пустыми. Или если врач может работать только утром? Тогда не было бы break_start или end ни в одном из полей календаря. Что, если, например, врач работает раз в две недели? Тогда у вас не будет простого способа хранить эту информацию. Также было бы много лишней информации. Если каждый врач будет работать с 8:00 до 16:00, эти данные будут храниться там повторно. Гораздо меньше места потребуется, если вы можете хранить такую информацию как отношение к некоторой записи продолжительности.
На вашем месте я бы создал более общий дизайн, в котором вы можете хранить до 365 записей (на каждый день в году) для каждого календаря. Тогда каждый день будет иметь отношение к списку интервалов, которые позже могут потребовать активности. Так вы получите более гибкий дизайн.
Черновик может выглядеть примерно так:
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)
Чтобы обеспечить целостность данных , вы можете добавить уникальное ограничение на комбинацию столбцов даты и календаря в таблице CalendarDay. Таким образом, каждый календарь может иметь только одну запись для определенной даты в таблице CalendarDay.