You need to enable JavaScript to run this app. Django酒店预订系统如何查询指定房间未来30天每日可入住人数
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 08:00:05