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
相关产品推荐
相关产品推荐

