Django rest framework 如何基于序列化程序(drf yasg)获取分页响应模式
目前,我正在drf上使用LimitOffsetPagination,并使用drf yasg记录API 我写了这样一个观点: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()) 序列化器=子模
类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)
]```
谢谢,我已经解决了,请参考您的解决方案