【问题标题】:Setting pagination_class in Django ListAPIView causes Runtime Error在 Django ListAPIView 中设置 pagination_class 会导致运行时错误
【发布时间】: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


    【解决方案1】:

    看报错信息,在你的get_queryset方法中,能不能改一下

    elif all_msgs == 'True':
                return self.queryset
    

    elif all_msgs == 'True':
                return self.queryset.all()
    

    ?

    【讨论】:

      猜你喜欢
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 2015-12-16
      • 2017-01-31
      • 1970-01-01
      • 2013-07-08
      相关资源
      最近更新 更多