You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

    # 其余方法保持不变...
关键修改说明
  1. 移除类属性的tables和report_sample_data:避免类加载时的一次性缓存
  2. 重写get_tables方法:MultiTableMixin会调用该方法获取表格列表,重写后每次请求都会重新查询数据库并生成表格实例
  3. 将report_sample_data移至方法内部:确保每次调用_get_context_data_dashboard时都能获取最新的样本数据

经过上述修改后,每次刷新页面或提交表单,视图都会重新查询数据库,过滤器表格就能始终展示最新数据了。

内容的提问来源于stack exchange,提问作者Yujin Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:48:14