Django Rest Framework视图内调用另一视图无法获取结果问题咨询
问题解答
你的实现方式不正确,你调用CourseFilterView.as_view({'get': 'list'})(...)得到的是DRF封装的Response对象,并非你需要的序列化业务数据,直接把该对象存入返回结果无法得到预期输出,同时在视图内直接调用另一个视图的可调用对象属于高耦合的错误实践,会重复执行请求解析、权限校验、响应渲染等冗余流程。
推荐解决方案(优先选择)
将两个视图需要复用的公共数据逻辑抽离为独立的公共方法,两个视图分别调用该方法即可,完全避免视图间的直接耦合:
# 抽离公共数据逻辑 def get_course_list_data(request): queryset = Course.objects.all() # 如有分页、过滤、排序逻辑,都可以放在该方法内 serializer = CourseFilterSerializer(queryset, many=True, context={"request": request}) return serializer.data # 原有视图复用逻辑 class CourseFilterView(ResponseViewMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet): serializer_class = CourseFilterSerializer queryset = Course.objects.all() def list(self, request, *args, **kwargs): data = get_course_list_data(request) return self.success_response(data) class CourseFilterListView(ResponseViewMixin, APIView): def get(self, request, *args, **kwargs): response_data = {} # 直接调用公共方法拿数据 response_data['a'] = get_course_list_data(request) print('a', response_data['a']) return self.success_response(response_data)
临时兼容方案(不推荐)
如果确实需要临时调用视图获取结果,可以直接取Response对象的data属性获取序列化后的业务数据:
class CourseFilterListView(ResponseViewMixin, APIView): def get(self, request, *args, **kwargs): response_data = {} view_callable = CourseFilterView.as_view({'get': 'list'}) response = view_callable(request._request, *args, **kwargs) # 从Response对象中提取业务数据 response_data['a'] = response.data print('a', response_data['a']) return self.success_response(response_data)
该方案仅适合临时调试使用,生产环境优先选择公共逻辑抽离方案,避免多余的性能开销和潜在的请求上下文传递问题。
内容的提问来源于stack exchange,提问作者user15361826
相关产品推荐
相关产品推荐

