Django 如何查询并在模板中展示未被预约的空闲日期
可以实现,你现有代码只需要调整判断逻辑即可。
问题核心原因
你现有代码的逻辑错误在于,循环判断条件写错了:你判断的是new_date not in not_found_dates,这会把范围内所有日期都加进去,完全没有和已预约的日期做比对,所以拿不到未预约的结果。
修正实现步骤
- 先把查询到的已预约日期统一转成date类型、去重后存入集合,提升比对效率
- 遍历日期范围时,判断当前日期不在已预约集合中,才加入未预约日期列表
修正后的代码
import datetime from .models import Appointment # 先确定查询的起止日期 start_date = datetime.date.today() end_date = start_date + datetime.timedelta(days=5) # 提取已预约的日期(如果start_appointment是datetime类型,要转成date再去重,避免类型不匹配导致比对失败) booked_dates = set() for apt in Appointment.objects.filter(start_appointment__range=(start_date, end_date)): booked_date = apt.start_appointment.date() if isinstance(apt.start_appointment, datetime.datetime) else apt.start_appointment booked_dates.add(booked_date) # 遍历日期范围,筛选未预约的日期 not_found_dates = [] for n in range(int((end_date - start_date).days)): current_date = start_date + datetime.timedelta(days=n) if current_date not in booked_dates: not_found_dates.append(current_date) # 原有的预约记录查询逻辑保留 examples = Appointment.objects.filter(start_appointment__range=(start_date, end_date)).values('start_appointment') return render(request, 'appointments/add-appointment.html', {'examples': examples, 'not_found_dates': not_found_dates})
模板渲染说明
你在模板中直接遍历not_found_dates即可输出所有未被预约的日期,按你给出的测试数据,最终输出的就是你需要的2021-11-24、2021-11-25、2021-11-26三个日期。
内容的提问来源于stack exchange,提问作者paniklas
相关产品推荐
相关产品推荐

