Django酒店预订系统如何查询指定房间未来30天每日可入住人数
实现方案
前提准备
首先你需要先给Room模型增加最大容纳人数字段,用于计算可用空位:
class Room(models.Model): # 原有字段保持不变 max_capacity = models.PositiveIntegerField(default=2, verbose_name="房间最大容纳人数")
核心逻辑说明
- 生成未来30天的日期序列,统一按服务器时区处理避免时间偏移问题
- 按酒店通用规则判断预订有效性:入住日算占用,退房日不算占用,即满足
预订开始时间 < 当日24点且预订结束时间 > 当日0点的预订为当日有效预订 - 统计当日所有有效预订的入住人数总和,用房间最大容量减去该总和即为当日可用空位,空位最小为0避免出现负数
代码实现
from django.utils import timezone from datetime import timedelta from django.db.models import Count from .models import Room, Reservation def get_room_daily_availability(room_id: int) -> dict: # 获取指定房间实例 room = Room.objects.get(id=room_id) max_cap = room.max_capacity availability = {} # 取当日零点为起始基准 today = timezone.now().date() for day_offset in range(30): # 生成当天的时间起止范围(带时区) current_date = today + timedelta(days=day_offset) day_start = timezone.make_aware( timezone.datetime.combine(current_date, timezone.datetime.min.time()) ) day_end = day_start + timedelta(days=1) # 筛选当前房间当日的有效预订,同时提前统计每个预订的入住人数 valid_reservations = Reservation.objects.filter( room_id=room_id, start_date__lt=day_end, end_date__gt=day_start ).annotate( guest_num=Count('person') ).values_list('guest_num', flat=True) # 计算当日总入住人数和可用空位 total_guests = sum(valid_reservations) available = max(max_cap - total_guests, 0) # 按要求格式化日期key date_key = current_date.strftime("%d-%b-%Y") availability[date_key] = available return availability
调用示例
直接传入房间ID即可得到你需要的返回格式:
result = get_room_daily_availability(room_id=1) print(result) # 输出示例:{'22-Jul-2021':5, '23-Jul-2021':2, ...}
性能优化建议
如果预订数据量较大,可提前一次性查出未来30天内的所有该房间预订,再按日期统计,避免30次循环查询数据库:
# 提前查出未来30天内的所有有效预订 future_30d_end = today + timedelta(days=30) future_30d_start = timezone.make_aware(timezone.datetime.combine(today, timezone.datetime.min.time())) all_reservations = Reservation.objects.filter( room_id=room_id, start_date__lt=future_30d_end, end_date__gt=future_30d_start ).annotate(guest_num=Count('person')).only('start_date', 'end_date', 'guest_num') # 再循环每天从all_reservations里筛选符合条件的统计即可
内容的提问来源于stack exchange,提问作者Katty Kay
相关产品推荐
相关产品推荐

