【问题标题】:Django - Show date and time of appointmentDjango - 显示约会的日期和时间
【发布时间】:2022-01-12 15:34:18
【问题描述】:

我目前正在显示所有未预订约会的日期。

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(Appointment.objects.values_list("start_appointment__date", flat=True).distinct())

set(timeframe) - set(exclude)

约会模式

class Appointment(models.Model):
    
    user = models.ForeignKey(Account, on_delete=models.CASCADE)
    seat = models.ForeignKey(Seat, on_delete=models.SET_NULL, null=True)
    work = models.ManyToManyField(Therapy, related_name='work', verbose_name=_('Work'), blank=True)
    start_appointment = models.DateTimeField(default=timezone.now, blank=True)
    end_appointment = models.DateTimeField(default=timezone.now, blank=True)

例如,我预约了:

[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:00 到晚上 21:00:。

当前的实现是否可行?如果是,我该如何实现?如果不能,请您建议另一种方法吗?

谢谢

【问题讨论】:

    标签: django list datetime django-queryset


    【解决方案1】:

    如果您需要显示可用时间,我建议您按日期分隔您的回复,因此如果您有日期时间(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(minutes=10*i) for appointment in appointments_of_day for i in range((appointment.end_appointment - appointment.start_appointment).seconds//600)]
        # same as above but more undestandeble
    # for appointment in appointments_of_day:
    #     for i in range((appointment.end_appointment - appointment.start_appointment)//600):
    #         reserved_times.append(appointment.start_appointment + timedelta(minutes=10*i))
        hours_between = [initial_date_time + timedelta(minutes=10*i) for i in range(((final_date_time - initial_date_time).seconds // 600) + 1)]
    avaliable_hours = [hour.time() for hour in hours_between if hour not in reserved_times]
        
        return render(request, "name_template.html", {"hours": avaliable_hours})
    

    如果您的约会的持续时间不是 10 的倍数,您必须更改代码以控制每分钟而不是上面示例中的 10 分钟

    【讨论】:

    • 感谢您的帮助。非常接近我想要的。如果你能帮助我根据我的模型写作,我将不胜感激!再次感谢您。
    • @paniklas 我编辑了我的答案,如果您有任何问题,我很乐意回复您
    • 感谢您根据我的模型回复。我尝试了您提供给我的代码和结果。我在打印时将day_request 更改为day_request = date.today() day_request1 = str(day_request),得到2021-12-082021-12-08 00:00:00。然后我得到“initial_date_time 2021-12-08 00:00:00”和final_date_time 2021-12-08 23:00:00。然后我正确地得到了预约<QuerySet [<Appointment: johnsmall@gmail.com>, <Appointment: jimbig@gmail.com>]>。但是 reserved_times 不返回任何内容。有什么想法吗?
    猜你喜欢
    • 2022-01-01
    • 2018-10-01
    • 2018-01-27
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多