Фильтр забронированных встреч по рабочим часам

Рабочие часы (TimeField) хранятся для каждого дня по времени UTC.

Таблица рабочих часов

business = models.ForeignKey(Business)
day = models.CharField(max_length=10)
opening_time = models.TimeField()
closing_time = models.TimeField()

Таблица назначений

appointment_time = models.DateTimeField()

Я пытаюсь получить записи на конкретный день для хранимого диапазона рабочих часов (между временем открытия_времени и временем закрытия_времени). Вот запрос

appointments = models.Appointments.objects.filter(service_start_time__week_day=3, service_start_time__gte=datetime.utcnow(), service_start_time__time__range=(day_obj.opening_time, day_obj.closing_time))

Иногда opening_time может быть больше, чем closing_time. Вышеприведенный запрос не получает записей по этой причине.

Для 03:00 (открытие) индийское стандартное время по UTC равно 22:30, а 20:00 (закрытие) по UTC равно 14:30. В этом случае время открытия кажется больше, чем время закрытия. Запрос ничего не фильтрует, хотя встречи доступны. Как решить эту проблему?

В этом случае вам необходимо преобразовать входные данные из UTC в IST.

  1. pip install pytz для установки библиотеки pytz, которая пригодится, когда вы делаете что-то подобное
  2. .
  3. now_utc = datetime.now(timezone('UTC')) это даст вам текущее время utc
  4. now_asia = now_utc.astimezone(timezone('Asia/Kolkata')) это даст вам время IST для того же времени UTC
  5. appointments = models.Appointments.objects.filter(service_start_time__week_day=3, service_start_time__gte=now_asia, service_start_time__time__range=(day_obj.opening_time, day_obj.closing_time)) <--ваш запрос будет отложен в соответствии с требованиями фильтра, поэтому внесите соответствующие изменения
  6. .
Вернуться на верх