with get_object_or_404 framework createapiview django pagination django-rest-framework

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