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

Django Rest Framework POST提交sqlite3数据需重启服务器才可见问题

问题根因

你的问题本质是Django QuerySet的惰性求值特性和类属性缓存机制共同导致的:

  • Run.objects.all()作为视图类的类属性定义时,只会在Django服务启动、视图类第一次被加载时执行一次数据库查询,查询结果会被长期缓存。
  • 后续所有接口请求都会复用这个缓存的查询结果,不会重新拉取数据库的最新数据,因此看不到新增记录。
  • 重启服务后视图类重新加载,QuerySet会再次执行查询,就可以拿到最新数据,和你观察到的现象完全一致。

正确写法

你修改后的写法是可行的,核心逻辑是每次请求都动态生成新的QuerySet,避免复用类属性的缓存结果,这里提供两种标准实现方案:

方案1:和你的修改逻辑一致,类属性保留管理器定义

class AllData(viewsets.ModelViewSet):
    # 仅赋值模型管理器,不触发查询
    queryset = Run.objects
    serializer_class = RunSerializer

    def get_queryset(self):
        # 每次请求都调用all()生成新的QuerySet,触发实时查询
        queryset = self.queryset.all()
        start_date = self.request.query_params.get('start_date')
        end_date = self.request.query_params.get('end_date')
        if start_date is not None and end_date is not None:
            queryset = queryset.filter(Q(date__gte=start_date) & Q(date__lte=end_date))
        return queryset

方案2:直接在get_queryset中定义查询逻辑(更通用)

如果不需要依赖类属性queryset做其他逻辑,直接把查询定义在get_queryset中即可,不需要额外写类属性:

class AllData(viewsets.ModelViewSet):
    serializer_class = RunSerializer

    def get_queryset(self):
        queryset = Run.objects.all()
        start_date = self.request.query_params.get('start_date')
        end_date = self.request.query_params.get('end_date')
        if start_date and end_date:
            # 这里可以省略Q表达式,多条件默认就是与逻辑
            queryset = queryset.filter(date__gte=start_date, date__lte=end_date)
        return queryset

补充说明

DRF的ModelViewSet中,如果你已经重写了get_queryset方法,类属性的queryset仅会在生成路由basename、构造权限/序列化器上下文等少数场景用到,如果你不需要用到这些能力,完全可以省略类属性的queryset定义,完全通过get_queryset动态生成查询集即可从根源避免缓存问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:24:02