【发布时间】:2020-03-14 09:21:35
【问题描述】:
我有一个基于类的文本消息视图,它继承自 django 通用视图 ListAPIView。正如您可能从继承的类名中看出的那样,视图被用作具有分页功能的 API(来自 Django Rest 框架)。
我想关闭某些特定查询的分页,但是即使我尝试通过此堆栈溢出问题 (Turn off automatic pagination of 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.
我am 没有问题地覆盖视图中的 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,因为它太大了
【问题讨论】:
标签: python django django-rest-framework