You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中过滤展示退房后12小时内的Booking模型对象

问题原因

你之前使用的check_out__hour=12是筛选check_out字段的小时部分等于12的记录,和你需要的「退房后12小时内展示」的时间范围逻辑完全不符,因此无法生效。

实现方案

你可以通过时间差值计算筛选符合要求的记录,核心逻辑是筛选退房时间大于等于12小时前的时间点,且小于等于当前时间的Booking对象,同时注意使用Django自带的时区工具避免时区偏移问题。

基础实现代码

首先导入依赖:

from django.utils import timezone
from datetime import timedelta

编写过滤逻辑:

# 计算12小时前的时间节点
twelve_hours_ago = timezone.now() - timedelta(hours=12)
# 筛选符合展示条件的记录,check_out__isnull=False用于排除退房时间为空的无效记录
visible_bookings = Booking.objects.filter(
    check_out__isnull=False,
    check_out__lte=timezone.now(),
    check_out__gte=twelve_hours_ago
)

进阶复用方案

如果该过滤逻辑需要频繁调用,可以自定义模型管理器方法,简化后续调用:

# models.py
from django.utils import timezone
from datetime import timedelta

class BookingManager(models.Manager):
    def visible_bookings(self):
        twelve_hours_ago = timezone.now() - timedelta(hours=12)
        return self.filter(
            check_out__isnull=False,
            check_out__lte=timezone.now(),
            check_out__gte=twelve_hours_ago
        )

class Booking(models.Model):
    check_in = models.DateTimeField(default=timezone.now)
    check_out = models.DateTimeField(blank=True,null=True)
    # 绑定自定义管理器
    objects = BookingManager()

后续需要获取可展示记录时,直接调用即可:

visible_bookings = Booking.objects.visible_bookings()

内容的提问来源于stack exchange,提问作者artiest

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:24:01