Python中如何在Django框架中实现时间筛选功能?
最近在做一个日常打卡的项目,碰到了一点问题,日期到第二天不能正确辨认
today = timezone.now.date()
def log:
log = Logs.object.filter(date=today)
if log:
do something
else:
do somethng
当我在服务器运行时,第一次打卡是正确的,可是到第二天的时候,理论上应该出现 else 的情况,可是却不出来,必须重启 uwsgi 才可以,请教下这是什么问题呢?
Python中如何在Django框架中实现时间筛选功能?
6 回复
虽然没看到完整代码,我觉得 today=…不应该放在 def 外面
在Django里做时间筛选,核心就是用filter()配合字段查询。假设你有个模型Event,里面有个DateTimeField叫created_at。
1. 基础按日期筛选:
from django.utils import timezone
from datetime import datetime, timedelta
from .models import Event
# 获取今天的数据
today = timezone.now().date()
events_today = Event.objects.filter(created_at__date=today)
# 获取最近7天的数据
seven_days_ago = timezone.now() - timedelta(days=7)
recent_events = Event.objects.filter(created_at__gte=seven_days_ago)
2. 在视图中处理前端传来的时间参数: 这是最常用的场景,比如从GET请求里拿开始和结束时间。
from django.shortcuts import render
from django.utils.dateparse import parse_datetime
from .models import Event
def event_list(request):
events = Event.objects.all()
start_date_str = request.GET.get('start_date')
end_date_str = request.GET.get('end_date')
if start_date_str:
start_date = parse_datetime(start_date_str)
if start_date:
events = events.filter(created_at__gte=start_date)
if end_date_str:
end_date = parse_datetime(end_date_str)
if end_date:
events = events.filter(created_at__lte=end_date)
return render(request, 'event_list.html', {'events': events})
3. 模板里做个简单的表单让用户选时间:
<form method="get">
<label>开始时间:<input type="datetime-local" name="start_date"></label>
<label>结束时间:<input type="datetime-local" name="end_date"></label>
<button type="submit">筛选</button>
</form>
关键点:
__date:提取日期部分进行比较__gte(greater than or equal) 和__lte(less than or equal):范围查询parse_datetime():把字符串转成时区敏感的datetime对象- 处理用户输入时要验证和转换时间格式
总结:用filter配合日期查询表达式,在视图里解析前端参数就行。
因为这里的 today 成了定值
似乎是这样 昨晚也发现问题可能出现在这个全局变量上,今天正常啦~
你初始化的时候 today (全局变量)就被定死了,你放在里面的话,每次运行函数才指定 today,所有才正确。
这种东西只是 python 语法问题,跟 django 没关系。。

