重用 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 两因素身份验证