django-rest-framework - 如何基于序列化器获取分页响应模式(drf-yasg)

标签 django-rest-framework pagination schema response drf-yasg

目前我在 drf 上使用 LimitOffsetPagination,并使用 drf-yasg 记录 API。

我写了一个这样的 View :

class MyViewSet(GenericViewSet):
    @action(detail=False, methods=['get'])
    def submodel1(self, request):
        queryset = SubModel1.objects.filter(user=request.user)
        queryset = self.paginate_queryset(queryset.all())

        serializer = SubModel1Serializer(queryset, many=True)
        return self.get_paginated_response(serializer.data)

    @action(detail=False, methods=['get'])
    def submodel2(self, request):
        queryset = SubModel2.objects.filter(user=request.user)
        queryset = self.paginate_queryset(queryset.all())

        serializer = SubModel2Serializer(queryset, many=True)
        return self.get_paginated_response(serializer.data)

现在我想使用 swagger_auto_schema 来记录它。

我想知道是否有一种方法可以在这些操作 View 上自动生成/添加分页响应架构和参数。

如果我在 swagger_auto_schema(responses={...}) 上使用 SubModel1Serializer(many=True),则响应架构将仅显示为 SubModel1s(或 2s),没有诸如上一个、下一个、项目之类的字段。

谢谢。

最佳答案

我们需要创建一个分页器检查器类并在 paginator_inspectors 下提供它swagger_auto_schema 的参数或者可以将该分页器类添加到 DEFAULT_PAGINATOR_INSPECTORS 下的全局设置中在SWAGGER_SETTINGS 。我自己创建了一个分页器类,将在此处提供作为示例。我遵循 LimitOffsetPagination。


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)),
                ('next', openapi.Schema(
                    type=openapi.TYPE_OBJECT,
                    properties=OrderedDict((
                        ('offset', openapi.Schema(type=openapi.TYPE_INTEGER)),
                        ('limit', openapi.Schema(type=openapi.TYPE_INTEGER))
                    ))
                )),
                ('results', response_schema),
            )),
            required=['results']
        )

    def get_paginator_parameters(self, paginator):
        """
        Get the pagination parameters for a single paginator **instance**.

        Should return :data:`.NotHandled` if this inspector does not know how to handle the given `paginator`.

        :param BasePagination paginator: the paginator
        :rtype: list[openapi.Parameter]
        """

        return [
            openapi.Parameter('offset', openapi.IN_QUERY, "Offset for Pagination", False, None, openapi.TYPE_INTEGER),
            openapi.Parameter('limit', openapi.IN_QUERY, "Page Size", False, None, openapi.TYPE_INTEGER)
        ]```

关于django-rest-framework - 如何基于序列化器获取分页响应模式(drf-yasg),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61410182/

相关文章:

django - 具有多个ID的DjangoFilterBackend

ReactJs FE 和 Django Rest 服务与 Azure AD 进行身份验证和授权

Laravel Eloquent 分页关系未显示在集合中

java - Salesforce REST API 查询超过 2000

HTML5 有效项目范围

django - 在序列化器方法字段中返回嵌套序列化器

php - 使用 MySQL 数据库子集的 AJAX 分页

mySQL Schema 设计建议

python - 数据库设计查询

django - 在 django-rest-framework 中使用 .to_representation() 和 .to_internal_value?