Изменение класса рендерера внутри пользовательской пагинации в django rest framework
Я использую пользовательский класс рендерера по умолчанию в settings.py. Для api я проверяю параметр запроса "page", если он существует, то делаю пагинацию результата, иначе возвращаю нормальный ответ, используя класс рендерера по умолчанию из settings.py. Но у меня есть проблема, я хочу использовать только JSONResponse renderer для пагинации
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 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)