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

Django rest framework 如何基于序列化程序(drf yasg)获取分页响应模式,django-rest-framework,pagination,schema,response,drf-yasg,Django Rest Framework,Pagination,Schema,Response,Drf Yasg,目前,我正在drf上使用LimitOffsetPagination,并使用drf yasg记录API 我写了这样一个观点: 类MyViewSet(GenericViewSet): @操作(detail=False,methods=['get']) def子模型1(自身,请求): queryset=SubModel1.objects.filter(user=request.user) queryset=self.paginate\u queryset(queryset.all()) 序列化器=子模

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

我写了这样一个观点:

类MyViewSet(GenericViewSet):
@操作(detail=False,methods=['get'])
def子模型1(自身,请求):
queryset=SubModel1.objects.filter(user=request.user)
queryset=self.paginate\u queryset(queryset.all())
序列化器=子模型1序列化器(queryset,many=True)
返回self.get_分页的_响应(serializer.data)
@操作(detail=False,methods=['get'])
def子模型2(自身,请求):
queryset=SubModel2.objects.filter(user=request.user)
queryset=self.paginate\u queryset(queryset.all())
序列化器=子模型2序列化器(queryset,many=True)
返回self.get_分页的_响应(serializer.data)
现在我想用
swagger\u auto\u schema
来记录它

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

如果在
swagger\u auto\u schema(responses={…})
上使用
SubModel1Serializer(many=True)
,则响应模式将仅显示为子模型1(或2)的数组,而不包含诸如prev、next、items等字段


谢谢。

解决方案是在一个视图集中有多个查询集和序列化程序

querysets={
“submodel1”:submodel1.objects.all(),
“submodel2”:submodel2.objects.all()
}
序列化程序\u类={
“submodel1”:submodel1序列化程序,
“submodel2”:submodel2序列化程序
}
def get_queryset(自我):
如果self.queryset中的self.action设置为:
返回self.querysets[self.action]
return super().get_queryset()
def get_序列化程序_类(自身):
如果self.queryset中的self.action设置为:
返回self.serializer_类[self.action]
返回super().get_serializer_class()

它就像一个魔术。(❁´◡`❁)

我们需要创建一个paginator inspector类,并在
paginator_inspector
参数下提供给
swagger_auto_schema
或者可以将该paginator类添加到
DEFAULT_paginator_inspector
中的
DEFAULT_paginator_inspector
下的全局设置中。我自己已经创建了一个paginator类,将提供作为一个例子,我遵循了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)
        ]```

谢谢,我已经解决了,请参考您的解决方案