如何使用 drf-spectaulous 在 django rfw 中生成自定义分页的模式?

Ant*_*nti 6 pagination swagger django-rest-framework drf-spectacular

我正在努力在 django Rest 框架中正确生成自定义分页的模式。\n我正在使用 drf-spectaulous 进行模式生成。我的自定义分页包括djangos PageNumberPagination 不附带的总页数字段。\n响应已正确序列化并返回,并包含总页数,但我的 swagger 文档中的架构不包含该字段。\n这是我的代码:

\n

分页.py

\n
from rest_framework import pagination\nfrom rest_framework.response import Response\n\nclass CustomPagination(pagination.PageNumberPagination):\n    page_size = 10\n    page_size_query_param = 'page_size'\n    max_page_size = 100\n    page_query_param = 'p'\n    \n    def get_paginated_response(self, data):\n        return Response({\n            'page_size': self.page_size,\n            'total_objects': self.page.paginator.count,\n            'total_pages': self.page.paginator.num_pages,\n            'current_page_number': self.page.number,\n            'next': self.get_next_link(),\n            'previous': self.get_previous_link(),\n            'results': data,\n        })\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的观点:

\n

视图.py

\n
@extend_schema_view(\n    get=extend_schema(\n        parameters=[OpenApiParameter("q", OpenApiTypes.STR, OpenApiParameter.QUERY),],\n        request=TestStandardSearchSerializer,\n        responses=TestStandardSerializer\n        )\n    )\nclass TestStandardSearchView(ListAPIView):\n    serializer_class = TestStandardSearchSerializer\n    queryset = TestStandard.objects.all()\n    pagination_class = CustomPagination\n   \n    def get(self, request, *args, **kwargs):\n        query = self.request.query_params.get('q')\n        queryset = SearchQuerySet().all().filter(content=query).order_by('acronym')\n        page = self.paginate_queryset(queryset)\n        serializer = self.get_serializer(page, many=True)\n        return self.get_paginated_response(serializer.data)\n    \n    def get_serializer_class(self):\n        if self.request.method == 'GET':\n           return TestStandardSearchSerializer\n
Run Code Online (Sandbox Code Playgroud)\n

我的 swagger 文档的响应架构如下:

\n
PaginatedTestStandardList\n{\ncount   integer                            example: 123\nnext    string($uri)     nullable: true    example: http://api.example.org/accounts/?p=4\nprevious    string($uri) nullable: true    example: http://api.example.org/accounts/?p=2\nresults [TestStandard{...}]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

标准 django 分页正确 \xc3\xadnserted 在架构中,但不是我的自定义分页响应。\n我期望/想要的是让我的自定义分页响应与“count”同一级别的总页数字段正确集成、“下一个”和“上一个”。

\n

我尝试过...\n我有一个使用drf_yasg的工作解决方案,使用 PaginatorInspector 提供自定义架构。但这在drf-spectaulous中不可用。\n我还在@extend_schema_view中使用了inline_serializer和自定义响应,例如:

\n
responses={\n            200: inline_serializer(\n           name='PaginatedTestStandardSearchResponse',\n           fields={\n               'total-pages': serializers.IntegerField(),\n               'results': TestStandardSearchSerializer()\n           },\n
Run Code Online (Sandbox Code Playgroud)\n

这导致了总页数嵌套在结果中的架构。\n我正在使用:

\n
drf-spectacular     0.21.2\nDjango              3.2.12\ndjango-rest-swagger 2.2.0\ndjangorestframework 3.12.4\n
Run Code Online (Sandbox Code Playgroud)\n

任何帮助表示赞赏。我最近刚刚开始使用 django rfw 和 openapi 模式生成。抱歉,如果我在这里错过了一些明显的东西。

\n

小智 8

get_paginated_response_schema您需要覆盖CustomPagination 中的方法。有关如何编写它的参考,您可以在rest_framework包内的pagination.py文件中看到它。

如果你想知道它是如何工作的,你可以在文件 openapi.py 的 drf-spectaulous 包中找到它,方法 _get_response_for_code。我希望能解决您的问题。