Django3.2线上服务部分QuerySet不自动更新需重启,本地运行正常
问题根因
你遇到的问题核心是顶层变量的加载机制导致日期参数固定:
- Django服务启动时会一次性加载
views.py的全部顶层代码,你定义的current_local_date只会在服务启动的那一刻计算一次,后续所有请求复用的都是服务启动时生成的固定日期字符串,而非请求发生时的实际日期。 - 第二个视图
view2没有用到这个固定的顶层日期变量,每次请求都会执行全新的查询,所以数据可以正常刷新。
你之前尝试的refresh_from_db是用于刷新单个模型实例的方法,不适用于调整QuerySet的查询参数,因此无效。
修复方案
把日期计算的逻辑从views.py顶层移到视图函数内部,这样每次请求触发视图时都会重新计算当前日期,保证查询参数是最新的:
import pytz from datetime import datetime from django.core.serializers import serialize # 移除原views.py顶层的utc_now、cst_now、current_local_date定义 def myFirstView(request): # 每次请求都重新计算当前日期 utc_now = pytz.utc.localize(datetime.utcnow()) cst_now = utc_now.astimezone(pytz.timezone("America/Chicago")) current_local_date = cst_now.strftime('%Y-%m-%d') variable2 = Calls.objects.filter(local_date = current_local_date).using('myDatabase').count() variable3 = serialize('json', Calls.objects.filter(local_date=current_local_date).using('myDatabase')) context = {'variable2':variable2, 'variable3':variable3} return render(request, 'myReport.html', context) def view2(request): variable1 = Calls.objects.all().order_by('-time_pulled', 'time')[:15].using('myDatabase') context = {'variable1':variable1} return render(request, 'myOtherReport.html', context)
额外排查点
如果修改后仍然存在查询不刷新的问题,可排查两个方向:
- 检查是否给
myFirstView配置了视图级缓存,导致返回的是缓存的旧页面 - 检查
myDatabase对应的数据库配置是否开启了查询缓存,导致相同查询语句直接返回旧结果
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

