Django - Показать дату и время приема

В настоящее время я показываю все даты, на которые не забронированы встречи.

from datetime import date, timedelta

num_days = 5
start_date = date.today()
timeframe = [start_date + timedelta(days=d) for d in range(num_days)]
exclude = list(Transaction.objects.values_list("start_appointment__date", flat=True).distinct())

set(timeframe) - set(exclude)

Например, у меня назначены встречи на:

[datetime.date(2021, 12, 8), datetime.date(2021, 12, 7), datetime.date(2021, 12, 7), datetime.date(2021, 12, 7)]

Даты, которые не забронированы:

{datetime.date(2021, 12, 10), datetime.date(2021, 12, 9), datetime.date(2021, 12, 11)}

Я хотел бы также показать доступное время для не забронированных дат с временным интервалом между 11:00AM и 21:00PM:.

Возможно ли это при текущей реализации? Если да, то как я могу этого добиться? Если нет, не могли бы вы предложить альтернативный способ?

Спасибо

Трудно судить по предоставленной информации.

  • Как выглядят модели баз данных
  • Что такое "встреча"?
  • Является ли "Транзакция" набором "встреч", или набором временных интервалов?
  • Если предположить, что "Сделки" - это набор временных интервалов, то как узнать, забронированы ли они? Если вы используете булев флаг, почему бы не отфильтровать его?
<<<С уважением //S

Если вам нужно показать доступное время, я предлагаю разделить ваш ответ по датам, так что если у вас есть один день, например datetime(2021, 12, 8), и вы хотите показать время между 11 утра и 21 вечера, вы можете использовать что-то вроде:

from datetime import date, datetime, time

    
date_of_reference = datetime(2021, 12, 8, 0, 0) #your the object of database
initial_time = datetime.combine(date_of_reference.date(), time(11, 0))
final_time = datetime.combine(date_of_reference.date(), time(21,0))

reserved_times = [datetime(2021, 12, 8, 11, 0), datetime(2021, 12, 8, 15, 0)] #reserved_times from database here

hours_between = [datetime.combine(date_of_reference.date(), time(hour + initial_time.hour, 0)) for hour in range(((final_time - initial_time).seconds // 3600) + 1)]
avaliable_hours = [hour for hour in hours_between if hour not in reserved_times]

В вашем коде будет что-то вроде

from datetime import datetime, timedelta
from .models import Appointment


# views
def check_available_hours(request):
    day_request = request.GET.get('day','') #day in format yyyy-MM-dd
    date_of_reference = datetime.strptime(day_request, "%Y-%m-%d")
    initial_date_time = date_of_reference
    final_date_time = date_of_reference + timedelta(hours=23)
    appointments_of_day = Appointment.objects.filter(
        start_appointment__gte=initial_date_time,
        start_appointment__lte=final_date_time
    )
    reserved_times = [
        appointment.start_appointment + timedelta(hours=i) for appointment in appointments_of_day for i in range((appointment.end_appointment - appointment.start_appointment).seconds//3600)]
    # same as above but more understandable
    # for appointment in appointments_of_day:
    #     for i in range((appointment.end_appointment - appointment.start_appointment)//3600):
    #         reserved_times.append(appointment.start_appointment + timedelta(hours=i))
    hours_between = [initial_date_time + timedelta(hours=hour) for hour in range(((initial_date_time - final_date_time).seconds // 3600) + 1)]
    avaliable_hours = [hour for hour in hours_between if hour not in reserved_times]
    
    return render(request, "name_template.html", {"hours": avaliable_hours})

Если ваши встречи не имеют продолжительности только в часах, вы должны контролировать минуты дня, а не часы, как в примере выше

Вернуться на верх