如何在Django中从日期时间字段筛选指定日期的数据?
解决Django中DateField的日期筛选问题
问题根源
你的代码将前端传入的日期字符串转换为datetime.datetime对象(带时间部分,如2022-11-24 00:00:00),但模型里的start_time和end_time是DateField类型,存储的是纯日期值(如2022-11-24)。用带时间的datetime对象做精确匹配,自然查不到对应记录。
解决方案
1. 转换为date类型做精确匹配
将转换后的datetime对象提取出date部分,直接匹配DateField:
修改views.py中的日期转换代码:
f_date = datetime.datetime.strptime(from_date,'%Y-%m-%d').date() t_date = datetime.datetime.strptime(to_date, '%Y-%m-%d').date()
然后筛选语句保持不变:
get_records_by_date = Scrapper.objects.filter(start_time=f_date, end_time=t_date)
2. 筛选时间段内的记录(可选)
如果你的需求是获取start_time在from_date到to_date之间,或end_time在该区间的记录,用Django的字段查找运算符:
# 匹配start_time >= from_date 且 end_time <= to_date的记录 get_records_by_date = Scrapper.objects.filter( start_time__gte=f_date, end_time__lte=t_date )
3. 修复模型字段的默认值错误
你的Scrapper模型中DateField的默认值设置有误:
start_time = models.DateField(default=True) end_time = models.DateField(default=True)
default=True会导致类型错误,应该改为合法的日期默认值,比如:
start_time = models.DateField(default=datetime.date.today) end_time = models.DateField(default=datetime.date.today)
或者使用Django的timezone:
from django.utils import timezone start_time = models.DateField(default=lambda: timezone.now().date()) end_time = models.DateField(default=lambda: timezone.now().date())
内容的提问来源于stack exchange,提问作者Ajay kk
相关产品推荐
相关产品推荐

