首页 > 解决方案 > 重用 Django Rest Framework Generic 视图来获取它的 QuerySet

问题描述

我有一个 Django Rest Framework 的通用视图,其中包含很多设置(排序、过滤、搜索等):

class MyViewClass(generics.ListAPIView):
    def get_queryset(self):
        return ...  # IMPORTANT: this uses self.request

    def get_serializer_class(self):
        return ...  # IMPORTANT: this uses self.request

    permission_classes = [permissions.IsAuthenticated]
    pagination_class = StandardResultsSetPagination
    filter_backends = [CustomOrdering, filters.SearchFilter]
    search_fields = ['field1', 'field2']
    ordering_fields = ['field1', 'field2', 'field3', 'field4']

现在我想从 QuerySet 下载文件,该文件必须使用相同的过滤器、排序和搜索参数进行计算。有没有办法重用由该视图计算的 QuerySet?我不需要分页(但是我认为我可以从前端解决这个问题,所以我不担心)。

我试过get_queryset用一个丑陋的技巧调用方法,但它没有应用搜索和排序:

@login_required()
def download_result_with_filters(request):
    class MockRequest:
        request: HttpRequest
    mock_request = MockRequest()
    mock_request.request = request
    queryset = MyView.get_queryset(mock_request)
    ...

任何形式的帮助将非常感激

标签: pythondjangodjango-rest-framework

解决方案


我可以打电话给MyViewClass内部download_result_with_filters

@login_required()
def download_result_with_filters(request):
    comb_dict: List[OrderedDict] = MyViewClass.as_view()(request=request).data['results']

您可以在data其中获取 Django REST Framework 视图的所有响应,例如分页字段。在上面的示例中,我只需要生成的 QuerySet 的元素,它包含在results分页响应的字段中


推荐阅读