如何在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
相关产品推荐
相关产品推荐

