【问题标题】:Django REST Framework - paginate_queryset() takes 2 positional arguments but 3 were givenDjango REST Framework - paginate_queryset() 接受 2 个位置参数,但给出了 3 个
【发布时间】:2020-08-12 01:36:35
【问题描述】:

真的不确定我在这里做错了什么,减去一些细节,它与 REST 框架网站上的两个示例非常相似,几乎是我拥有的另一个 Viewset 的抄本。

class ArtistViewSet(
    mixins.ListModelMixin,
    mixins.RetrieveModelMixin,
    viewsets.GenericViewSet,
    ArtistSetPagination
):
    queryset = Profile.objects.all()
    permission_classes = [permissions.AllowAny,]
    pagination_class = ArtistSetPagination
    serializer_class = ProfileSerializer

    def get_queryset(self, *args, **kwargs):
        return Profile.objects.all().prefetch_related(
            'user'
        )

    # Artwork List & List Filtering API View:
    def list(self, request, *args, **kwargs):
        parameters = {key: request.GET.get(key) for key in dict(request.GET).keys()}

        queryset = self.get_queryset().annotate(
            first_name_len=Length('user__first_name'),
            last_name_len=Length('user__last_name')
        ).filter(
            first_name_len__gt=0,
            last_name_len__gt=0,
        ).filter(
            **parameters
        ).order_by(
            '-created'
        )

        page = self.paginate_queryset(queryset, self.request)

        if page is not None:
            serializer = ProfileSerializer(page, context={'request': request}, many=True)
            data = paginated.data
            paginated = self.get_paginated_response(data)
        else:
            serializer = ProfileSerializer(queryset, context={'request': request}, many=True)
            data = serializer.data

        response = standardized_json_response(
            message='Artist Objects Has Been Successfully Listed',
            timestamp=datetime.datetime.now(),
            data=data
        )

        return Response(data=response, status=status.HTTP_200_OK)

我所看到的不同之处在于 Length() 的注释的使用...

如果有人有任何建议,我很乐意接受。

注意standardised_json_response() 只是一个包装器,它接受一些变量并返回一个 dict() 对象,只是注入一些额外的元数据,例如请求的时间戳和成功状态(真/假)

【问题讨论】:

标签: django django-rest-framework pagination


【解决方案1】:

顾名思义,paginate_queryset 对给定的查询集进行分页。 这是它的定义:

def paginate_queryset(self, queryset):
        """
        Return a single page of results, or `None` if pagination is disabled.
        """

在这里您使用附加参数self.request 调用它:page = self.paginate_queryset(queryset, self.request),而不是page = self.paginate_queryset(queryset)

【讨论】:

    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2019-09-21
    • 2019-07-19
    • 2021-02-02
    相关资源
    最近更新 更多