Django时区异常:本地正常但PythonAnywhere生产环境显示昨日销售数据
解决PythonAnywhere上Django ListView持续显示前一天销售数据的问题
这个问题我之前也碰到过,核心原因是类属性queryset在服务器启动时就被一次性计算并缓存了,之后不会随着请求重新生成。你的代码里timezone.now()只在PythonAnywhere启动(或reload)时执行一次,之后不管过了多少天,都会一直用那个旧日期来过滤数据,这就是为什么只有reload才能临时解决的原因。
正确的解决方案:改用get_queryset()方法
把类属性queryset替换成动态的get_queryset()方法,这样每次请求进来都会重新计算当前日期,就不会有缓存旧日期的问题了:
from django.utils import timezone from django.views.generic.list import ListView from .models import Venta # 确保导入你的模型 class VentaToday(ListView): template_name = 'venta/venta_today.html' def get_queryset(self): # 每次请求都会重新获取当前日期 today = timezone.now().date() return Venta.objects.filter(fecha=today).order_by('-id')
额外的注意事项
- 如果你的
Venta模型中fecha字段是DateTimeField而不是DateField,记得用fecha__date=today来过滤,这样才能匹配当天所有时间点的记录:return Venta.objects.filter(fecha__date=today).order_by('-id') - 再次确认你的Django时区配置:在
settings.py里确保TIME_ZONE设置正确(比如TIME_ZONE = 'America/Argentina/Buenos_Aires',根据你的实际时区调整),并且USE_TZ = True,这样timezone.now()才会使用服务器配置的时区。
这样修改后,不需要手动reload服务器,每次访问页面都会自动获取当天的销售数据了。
内容的提问来源于stack exchange,提问作者Piero Pajares
相关产品推荐
相关产品推荐

