Django tables2问题:表格刷新或新增过滤器后恢复旧数据
问题根源:类属性导致的QuerySet缓存
你的核心问题在于视图类中的tables和report_sample_data是类属性,Django在类首次加载时就会执行objects.all()并缓存QuerySet结果,后续所有请求都会复用这个缓存的旧数据,这就是为什么新增过滤器后刷新页面会回到初始状态的原因。
解决方案:将QuerySet获取逻辑移至实例方法
修改视图类,把类属性的QuerySet移到每次请求都会执行的实例方法中,确保每次请求都能获取最新的数据库数据:
class Dashboard(MultiTableMixin, TemplateView): template_name = "dashboard.html" model = Report table_pagination = { "per_page": 10 } # 重写MultiTableMixin的get_tables方法,每次请求重新生成表格 def get_tables(self): return [ ReportTable(Report.objects.all()), FilterTable(Filter.objects.all()) ] def _get_context_data_dashboard(self): """ Get the basic data that needs to be displayed in the dashboard page Returns: dict: Dict of report and assay data to be passed to the dashboard """ context = self.get_context_data(object_list="") print(f"original: {context['tables']}") # 每次请求重新获取样本数据,避免类属性缓存 report_sample_data = Report_Sample.objects.all() assays = sorted({ assay for assay in report_sample_data.values_list( "assay", flat=True) }) sequencer_ids = sorted({ sequencer_id for sequencer_id in self.model.objects.all().values_list( "sequencer_id", flat=True) }) project_names = sorted( project_name for project_name in self.model.objects.all().values_list( "project_name", flat=True) ) context["project_names"] = project_names context["assays"] = assays context["sequencer_ids"] = sequencer_ids plotable_metrics = { **self._get_plotable_metrics(bam_qc), **self._get_plotable_metrics(fastq_qc), **self._get_plotable_metrics(vcf_qc) } context["metrics"] = dict(sorted(plotable_metrics.items())) return context # 其余方法保持不变...
关键修改说明
- 移除类属性的
tables和report_sample_data:避免类加载时的一次性缓存 - 重写
get_tables方法:MultiTableMixin会调用该方法获取表格列表,重写后每次请求都会重新查询数据库并生成表格实例 - 将
report_sample_data移至方法内部:确保每次调用_get_context_data_dashboard时都能获取最新的样本数据
经过上述修改后,每次刷新页面或提交表单,视图都会重新查询数据库,过滤器表格就能始终展示最新数据了。
内容的提问来源于stack exchange,提问作者Yujin Kim
相关产品推荐
相关产品推荐

