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

如何在Django中按时间(时分)范围过滤模型查询对象?

Django按时间范围过滤DateTimeField字段的方法

你尝试的Sample.objects.filter(created_at__range=["13:00", "15:00"])写法不可行。因为created_at是DateTimeField类型,存储的是包含日期、时间、时区的完整时间戳,直接传入纯时间字符串会导致Django无法正确解析,最终过滤结果不符合预期。

下面是几种可行的实现方式:

1. 按小时范围过滤

通过hour查询条件筛选小时数在目标区间内的记录:

# 筛选13:00 ≤ 时间 < 15:00的记录(包含13点、14点,不包含15点)
Sample.objects.filter(created_at__hour__range=(13, 15))

# 如果需要包含15:00整的记录,需补充额外条件
from django.db.models import Q
Sample.objects.filter(
    Q(created_at__hour__range=(13, 15)) | 
    Q(created_at__hour=15, created_at__minute=0, created_at__second=0)
)

2. 直接匹配时间部分

利用Django对DateTimeField的time提取功能,结合datetime.time对象精准匹配时间范围:

from datetime import time

# 筛选时间在13:00到15:00之间的记录(包含两端)
Sample.objects.filter(created_at__time__range=(time(13), time(15)))

这种方式会忽略日期部分,只要记录的时间落在该区间内就会被筛选出来。

3. 针对特定日期的时间范围

如果需要限定某一天的时间区间,构造完整的datetime对象(注意时区要与模型字段的时区一致):

from datetime import datetime, timezone

# 示例:筛选2022-12-13 13:00 至 2022-12-13 15:00的记录
start_dt = datetime(2022, 12, 13, 13, 0, tzinfo=timezone.utc)
end_dt = datetime(2022, 12, 13, 15, 0, tzinfo=timezone.utc)
Sample.objects.filter(created_at__range=(start_dt, end_dt))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:20:25