在 django rest 框架的自定义分页中更改渲染器 class
Change renderer class inside custom pagination in django rest framework
我在 settings.py 中默认使用自定义渲染器 class。对于 api,我检查查询参数“page”,如果它存在,那么我使用来自 settings.py 的默认渲染器 class 对结果进行分页,否则 return 正常响应。但是我有问题,我只想使用 JSONResponse 渲染器进行分页
settings.py
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'app.core.renderers.CustomJSONRenderer',
"rest_framework.renderers.JSONRenderer",
"rest_framework.renderers.BrowsableAPIRenderer",
),
}
renderers.py
class CustomJSONRenderer(JSONRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
status_code = renderer_context['response'].status_code
response = {
"success": True,
"message": None,
"data": data,
}
return super(CustomJSONRenderer, self).render(response, accepted_media_type, renderer_context)
views.py
class User_View(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = User_Serializer
pagination_class = CustomPagination
### If page param exist then use pagination class else not use
pagination.py
class CustomPagination(PageNumberPagination):
page_size_query_param = 'size'
page_size = int(settings.PAGE_SIZE)
def get_paginated_response(self, data):
return Response({
'success': True,
'total': self.page.paginator.count,
'page_size': self.get_page_size(self.request),
'current_page': self.page.number,
'last_page': self.page.paginator.num_pages,
'data': data,
})
错误回复:
{
"success": true,
"message": null,
"data": {
"success": true,
"total": 6,
"page_size": 15,
"current_page": 1,
"last_page": 1,
"data": [
{
"id": 1,
"username": "admin",
"permissions": []
}
]
}
}
正确答案(预期):
{
"success": true,
"total": 6,
"page_size": 15,
"current_page": 1,
"last_page": 1,
"data": [
{
"id": 1,
"username": "admin",
"permissions": []
}
]
}
我该如何解决?
我通过更新 CustomJSONRenderer 解决了问题 class
class CustomJSONRenderer(JSONRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
status_code = renderer_context['response'].status_code
request = renderer_context.pop('request')
page = request.query_params.get('page', None)
# Check page query params
if page is not None:
response = data
else:
response = {
'success': True,
'message': None,
'data': data,
}
return super(CustomJSONRenderer, self).render(response, accepted_media_type, renderer_context)
我在 settings.py 中默认使用自定义渲染器 class。对于 api,我检查查询参数“page”,如果它存在,那么我使用来自 settings.py 的默认渲染器 class 对结果进行分页,否则 return 正常响应。但是我有问题,我只想使用 JSONResponse 渲染器进行分页
settings.py
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'app.core.renderers.CustomJSONRenderer',
"rest_framework.renderers.JSONRenderer",
"rest_framework.renderers.BrowsableAPIRenderer",
),
}
renderers.py
class CustomJSONRenderer(JSONRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
status_code = renderer_context['response'].status_code
response = {
"success": True,
"message": None,
"data": data,
}
return super(CustomJSONRenderer, self).render(response, accepted_media_type, renderer_context)
views.py
class User_View(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = User_Serializer
pagination_class = CustomPagination
### If page param exist then use pagination class else not use
pagination.py
class CustomPagination(PageNumberPagination):
page_size_query_param = 'size'
page_size = int(settings.PAGE_SIZE)
def get_paginated_response(self, data):
return Response({
'success': True,
'total': self.page.paginator.count,
'page_size': self.get_page_size(self.request),
'current_page': self.page.number,
'last_page': self.page.paginator.num_pages,
'data': data,
})
错误回复:
{
"success": true,
"message": null,
"data": {
"success": true,
"total": 6,
"page_size": 15,
"current_page": 1,
"last_page": 1,
"data": [
{
"id": 1,
"username": "admin",
"permissions": []
}
]
}
}
正确答案(预期):
{
"success": true,
"total": 6,
"page_size": 15,
"current_page": 1,
"last_page": 1,
"data": [
{
"id": 1,
"username": "admin",
"permissions": []
}
]
}
我该如何解决?
我通过更新 CustomJSONRenderer 解决了问题 class
class CustomJSONRenderer(JSONRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
status_code = renderer_context['response'].status_code
request = renderer_context.pop('request')
page = request.query_params.get('page', None)
# Check page query params
if page is not None:
response = data
else:
response = {
'success': True,
'message': None,
'data': data,
}
return super(CustomJSONRenderer, self).render(response, accepted_media_type, renderer_context)