get_object_or_404 - Configuraciones de paginación de Django Rest Framework-Content-Range
pagination django rest framework (1)
6.30.15 - ¿CÓMO PUEDO HACER MEJOR LA PREGUNTA Y AYUDAR A LOS DEMÁS? LA RETROALIMENTACIÓN SERÍA ÚTIL. ¡GRACIAS!
Estoy utilizando DRF como servidor para una aplicación web Dojo / Dgrid. Dojo necesita un rango de contenido o respuesta de rango del servidor. Actualmente no envía ninguno y la paginación de dgrid.grid no funciona correctamente.
En la documentación de DRF, indica "enlaces de paginación que se incluyen en los encabezados de respuesta, como Content-Range o Link". Pero no da un proceso claro sobre CÓMO configurar la API de DRF para hacer esto. Todavía soy relativamente nuevo en el desarrollo de aplicaciones web. ¡Cualquier ayuda sería apreciada!
1. Incluir encabezado de Link
en respuesta:
Para incluir un encabezado Link
en su respuesta, debe crear una clase de serializador de paginación personalizada. Esto debería get_paginated_response(self, data)
pagination.BasePagination
y anular el get_paginated_response(self, data)
.
Ejemplo (tomado de documentos ):
Supongamos que queremos reemplazar el estilo de salida de paginación predeterminado con un formato modificado que incluye los enlaces siguiente y anterior en un encabezado de Link
, get_paginated_response()
.
class LinkHeaderPagination(pagination.PageNumberPagination):
def get_paginated_response(self, data):
next_url = self.get_next_link()
previous_url = self.get_previous_link()
if next_url is not None and previous_url is not None:
link = ''<{next_url}; rel="next">, <{previous_url}; rel="prev">''
elif next_url is not None:
link = ''<{next_url}; rel="next">''
elif previous_url is not None:
link = ''<{previous_url}; rel="prev">''
else:
link = ''''
link = link.format(next_url=next_url, previous_url=previous_url)
headers = {''Link'': link} if link else {}
return Response(data, headers=headers)
Después de esto, necesitamos incluir esta clase de paginación en nuestra configuración para que sea utilizada por DRF en lugar de las clases de paginación predeterminadas.
REST_FRAMEWORK = {
''DEFAULT_PAGINATION_CLASS'': ''my_project.apps.core.pagination.LinkHeaderPagination'',
''PAGE_SIZE'': 100
}
Las respuestas de la API para los puntos finales de la lista ahora incluirán un encabezado de Link
.
2. Incluyendo el encabezado Content-Range
en respuesta:
También puede enviar encabezado Content-Range
lugar de Link
. Simplemente cree un diccionario de encabezados con Content-Range
como la clave y el valor, como cuántos elementos se devuelven y cuántos elementos totales existen.
Por ejemplo:
class ContentRangeHeaderPagination(pagination.PageNumberPagination):
def get_paginated_response(self, data):
total_items = self.page.paginator.count
item_starting_index = self.page.start_index() - 1 # In a page, indexing starts from 1
item_ending_index = self.page.end_index() - 1
content_range = ''items {0}-{1}/{2}''.format(item_starting_index, item_ending_index, total_items)
headers = {''Content-Range'': content_range}
return Response(data, headers=headers)
Supongamos que este es el encabezado recibido:
Content-Range: items 0-9/50
Esto nos dice que la respuesta tiene un encabezado Content-Range
con valor como items 0-9/50
. Esto indica que los 10 primeros elementos se devuelven del total de 50
.
También puede usar *
lugar de no total. de artículos si calcular el total es costoso.
Content-Range: items 0-9/* # Use this if total is expensive to calculate