首页 > 解决方案 > 在 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 因为它太大了

标签: pythondjangodjango-rest-framework

解决方案


查看错误消息,在您的 get_queryset 方法中,您可以尝试更改

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

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

?


推荐阅读