python - 在 Django ListAPIView 中设置 pagination_class 会导致运行时错误
问题描述
我有一个基于类的文本消息视图,它继承自 django 通用视图 ListAPIView。正如您可能从继承的类名中看出的那样,视图被用作具有分页功能的 API(来自 Django Rest 框架)。
我想关闭某些特定查询的分页,但是即使我尝试通过此堆栈溢出问题(关闭 Django Rest Framework ModelViewSet 的自动分页)关闭所有查询的分页,我也会收到以下错误:
RuntimeError: Do not evaluate the `.queryset` attribute directly, as the result will be cached and reused between requests. Use `.all()` or call `.get_queryset()` instead.
我在视图中覆盖get_queryset()方法没有问题,但是通过将paginator_class变量设置为None我收到此错误。任何帮助,将不胜感激。这是一些代码:
view.py:
class TextMessageView(generics.ListAPIView):
queryset = TextMessage.objects.all()
serializer_class = TextMessageSerializer
pagination_class = None
def get_queryset(self):
"""
If a phone number is included in the url query, return only the text messages sent by that number in the
queryset, otherwise return all text messages.
:return: A Django queryset with a variable number of text messages.
"""
from_phone_num = self.request.query_params.get('from_phone_number', None)
distinct_nums = self.request.query_params.get('distinct_numbers', None)
all_msgs = self.request.query_params.get('all_messages', None)
if from_phone_num:
return TextMessage.objects.filter(from_phone_number=from_phone_num)
elif distinct_nums == 'True':
return TextMessage.objects.order_by('from_phone_number', '-date_of_message').distinct('from_phone_number')
elif all_msgs == 'True':
return self.queryset
else:
raise Http404
Django Rest Frameworks: ListAPIView.py
class ListAPIView(mixins.ListModelMixin,
GenericAPIView):
"""
Concrete view for listing a queryset.
"""
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
Django Rest Frameworks: mixins.py
class ListModelMixin:
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
你必须查找 GenericAPIView.py 因为它太大了
解决方案
查看错误消息,在您的 get_queryset 方法中,您可以尝试更改
elif all_msgs == 'True':
return self.queryset
至
elif all_msgs == 'True':
return self.queryset.all()
?
推荐阅读
- javascript - Handlebars 点符号路径表达式返回空白值,但正常(非路径)表达式有效
- python - 通过 API (Python) 将多个视频添加到 youtube-playlist
- angular - Angular 如何在继续下一行之前等待方法完成
- c - 在C中返回字符串数组的函数
- android - 为什么 Double 从我的数据库返回错误的数据?
- python - 如何向我的 Django 自定义用户模型的密码添加安全要求?
- arduino - ESP32 同时使用 Async Web 服务器和 Now 协议?
- c++ - 链接目标文件时的 NVCC 多个定义
- angular - 如何用 Angular App 的异步 Indexed-db 替换同步本地存储
- python - 如何将 Spacy 模型添加到 requirements.txt 文件?