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,里面有个DateTimeFieldcreated_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 没关系。。

回到顶部