重用 Django Rest Framework Generic 视图来获取它的 QuerySet

Posted

技术标签:

【中文标题】重用 Django Rest Framework Generic 视图来获取它的 QuerySet【英文标题】:Reuse Django Rest Framework Generic view to get its QuerySet 【发布时间】:2021-01-19 17:35:59 【问题描述】:

我有一个 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)
    ...

任何形式的帮助都将不胜感激

【问题讨论】:

您可能正在寻找渲染器django-rest-framework.org/api-guide/renderers 感谢您的评论!我找到了一个从视图响应中获取数据的解决方案。我稍后会提交答案! 【参考方案1】:

我可以在download_result_with_filters 中调用MyViewClass

@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 字段中

【讨论】:

以上是关于重用 Django Rest Framework Generic 视图来获取它的 QuerySet的主要内容,如果未能解决你的问题,请参考以下文章

Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers

Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证

怎么安装django rest framework

django rest framework中文介绍

17-Django-Django REST framework-REST framework及RESTful简介

为啥 django-rest-framework 不显示 OneToOneField 数据 - django