Model kalendarza Django

Oct 26 2020

Buduję aplikację do wizyt u lekarza z Django i Django Rest Framework. Aplikacja będzie miała funkcję umożliwiającą sekretarzom dodawanie spotkań do kalendarza lekarza, a każdy lekarz może mieć więcej niż jedną klinikę (i wiele sekretarek).

Zbudowałem ten CalendarModel, aby przechowywać informacje o dostępności lekarza, które zasadniczo muszą informować:

  • danego dnia, o której lekarz rozpoczyna i kończy pracę
  • danego dnia, o której lekarz zaczyna i kończy przerwę (jeśli tak).

Czy to optymalny sposób, aby to zrobić?

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

Odpowiedzi

3 Najiva Oct 29 2020 at 01:41

Jest to stosunkowo proste rozwiązanie, które masz tutaj i teoretycznie mogłoby zadziałać, ale z mojego doświadczenia w praktyce wynika, że ​​potrzebujesz czegoś bardziej elastycznego. Nie myślisz też o redundancji danych.

A gdyby tak np. Lekarz pracował tylko jeden dzień w tygodniu. Większość kolumn byłaby wtedy pusta. A może lekarz może pracować tylko rano? Wtedy nie byłoby break_start ani end w żadnym z pól kalendarza. A jeśli na przykład lekarz pracuje co drugi tydzień? Wtedy nie będziesz mieć łatwego sposobu przechowywania tych informacji. Byłoby też wiele zbędnych informacji. Jeśli każdy lekarz będzie pracował w godzinach od 8:00 do 16:00, dane te będą przechowywane w nim nadmiarowo. Potrzeba dużo mniej miejsca, jeśli takie informacje można przechowywać jako relację do jakiegoś rekordu czasu trwania.

Na twoim miejscu stworzyłbym bardziej ogólny projekt, w którym możesz przechowywać do 365 rekordów (na każdy dzień w roku) dla każdego kalendarza. Wtedy każdy dzień byłby powiązany z listą interwałów, które później mogą być wymaganą czynnością. W ten sposób uzyskasz bardziej elastyczny projekt.

Szkic mógłby wyglądać mniej więcej tak:

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)

Aby zapewnić integralność danych , można dodać unikalne ograniczenie dotyczące kombinacji kolumn daty i kalendarza w tabeli CalendarDay. W ten sposób każdy kalendarz może mieć tylko jeden rekord dla określonej daty w tabeli CalendarDay.