简体   繁体   English

drf-yasg:在 Swagger 文档中显示 ListAPIView 的自定义分页

[英]drf-yasg: Show custom pagination for ListAPIView in Swagger docs

I have following ListAPIView and custom pagination class in Django REST framework:我在 Django REST 框架中有以下 ListAPIView 和自定义分页 class :

views.py视图.py

class pricetrend(generics.ListAPIView):
    queryset = Variants.objects.annotate(timestamp=TruncMonth('variantTimestamp')).values('timestamp').annotate(average_price=Avg('price'))
    serializer_class = PricetrendSerializer
    pagination_class = PricesPagination

custom pagination class自定义分页 class

class PricesPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = 'page_size'

    def get_paginated_response(self, data):
        prices = [dict(item)['average_price'] for item in data]
        try:
            total_average_price = sum(prices)/ len(prices)
        except Exception as e:
            total_average_price = 0
        return Response({
            'count': self.page.paginator.count,
            'next': self.get_next_link(),
            'previous': self.get_previous_link(),
            'total_average_price': round(total_average_price),
            'results': data,
        })

Currently, I am trying to figure out how the custom pagination class can be shown in the Swagger API docs generated by drf-yasg.目前,我正在尝试弄清楚自定义分页 class 如何在 drf-yasg 生成的 Swagger API 文档中显示。

I already customized the PaginatorInspector from drf_yasg.inspectors but don't know where I need to put that in order to use it for the above mentioned ListAPIView.我已经从 drf_yasg.inspectors 定制了 PaginatorInspector,但不知道我需要把它放在哪里才能将它用于上述 ListAPIView。

custom PaginatorInspector自定义 PaginatorInspector

from drf_yasg.inspectors import PaginatorInspector
from drf_yasg import openapi


class LimitOffsetPaginatorInspectorClass(PaginatorInspector):

    def get_paginated_response(self, paginator, response_schema):
        """
        :param BasePagination paginator: the paginator
        :param openapi.Schema response_schema: the response schema that must be paged.
        :rtype: openapi.Schema
        """

        return openapi.Schema(
            type=openapi.TYPE_OBJECT,
            properties=OrderedDict((
                ('count', openapi.Schema(type=openapi.TYPE_INTEGER) if has_count else None),
                ('next', openapi.Schema(type=openapi.TYPE_STRING, format=openapi.FORMAT_URI, x_nullable=True)),
                ('previous', openapi.Schema(type=openapi.TYPE_STRING, format=openapi.FORMAT_URI, x_nullable=True)),
                ('total_average_price', openapi.Schema(type=openapi.TYPE_INTEGER)),
                ('results', response_schema),
            )),
            required=['results']
        )

As I am using other ListAPIViews with the default pagination class specified in settings.py, the custom pagination class should only be used for the ListAPIView "pricetrend".由于我正在使用其他 ListAPIViews 并在 settings.py 中指定了默认分页 class,因此自定义分页 class 应仅用于 ListAPIView“价格趋势”。

Solved it as follows:解决如下:

  1. Creating custom Paginator Inspector创建自定义分页器检查器

Paginator Inspector分页检查员

class LimitOffsetPaginatorInspectorClass(PaginatorInspector):

def get_paginated_response(self, paginator, response_schema):
    """
    :param BasePagination paginator: the paginator
    :param openapi.Schema response_schema: the response schema that must be paged.
    :rtype: openapi.Schema
    """

    return openapi.Schema(
        type=openapi.TYPE_OBJECT,
        properties=OrderedDict((
            ('count', openapi.Schema(type=openapi.TYPE_INTEGER)),
            ('next', openapi.Schema(type=openapi.TYPE_STRING, format=openapi.FORMAT_URI, x_nullable=True)),
            ('previous', openapi.Schema(type=openapi.TYPE_STRING, format=openapi.FORMAT_URI, x_nullable=True)),
            ('total_average_price', openapi.Schema(type=openapi.TYPE_INTEGER)),
            ('results', response_schema),
        )),
        required=['results']
    )
  1. Overriding ListAPIView in order to be able to use @swagger_auto_schema to specify custom paginator inspector覆盖 ListAPIView 以便能够使用 @swagger_auto_schema 来指定自定义分页器检查器

views.py视图.py

class pricetrend(generics.ListAPIView):
    queryset = Variants.objects.annotate(timestamp=TruncMonth('variantTimestamp')).values('timestamp').annotate(average_price=Avg('price'))
    serializer_class = PricetrendSerializer
    pagination_class = PricesPagination
    @swagger_auto_schema(pagination_class=PricesPagination, paginator_inspectors=[LimitOffsetPaginatorInspectorClass])
    def get(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        serializer = PricetrendSerializer(page, many=True)
        return self.get_paginated_response(serializer.data)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM