Модель календаря Django

Oct 26 2020

Я создаю приложение для записи к врачу с помощью 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

Ответы

3 Najiva Oct 29 2020 at 01:41

Это относительно простое решение, которое у вас есть, и оно может теоретически работать, но, по моему опыту, вам нужно что-то более гибкое. И не думаешь о избыточности данных.

Что, если врач, например, работает только один день в неделю. Тогда большинство столбцов будут пустыми. Или если врач может работать только утром? Тогда не было бы 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.