Django REST Framework - paginate_queryset () принимает 2 позиционных аргумента, но 3 было дано - PullRequest
0 голосов
/ 28 апреля 2020

Действительно не уверен, что я сделал здесь неправильно, за исключением нескольких деталей, он очень похож на оба примера на веб-сайте REST Framework и почти точную копию другого моего 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() ...

Если у кого-то есть какие-либо указатели, я бы с радостью согласился.

NB. standardised_json_response() - это просто оболочка, которая принимает несколько переменных и возвращает объект dict (), просто внедряя некоторые дополнительные мета, такие как отметка времени запроса и статус успеха (True / False)

1 Ответ

1 голос
/ 28 апреля 2020

Как видно из названия, 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)

...