django - La paginación personalizada DRF no funciona correctamente

CorePress2024-01-25  12

Recientemente estuve trabajando con la clase de paginación drf, PageNumberPagination. Puede que haya encontrado o no un error extraño. Los documentos oficiales mencionan que, para anular el tamaño de página de PageNumberPagination, tenemos que crear un paginador personalizado que anule la configuración del tamaño de página como se muestra a continuación

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 100
    page_size_query_param = 'page_size'
    max_page_size = 1000
class BillingRecordsView(generics.ListAPIView):
    queryset = Billing.objects.all()
    serializer_class = BillingRecordsSerializer
    pagination_class = LargeResultsSetPagination

Pero cuando intenté hacer lo mismo, el paginador personalizado estaba usando la configuración predeterminada como 100 Aquí está mi fragmento que usé

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = 'page_size'
    max_page_size = 100

class TrendingClassesView(ListAPIView):
    pagination_class = StandardResultsSetPagination
    serializer_class = BaseClassTileSerializer
    queryset = BaseClass.objects.all()

En un momento el código funcionaba bien, pero después de jugar con el tamaño de la página durante algún tiempo, el paginador simplemente dejó de funcionar. Tengo que hacer algo como lo siguiente para que el tamaño de la página funcione

class StandardResultsSetPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = 'page_size'
    max_page_size = 100

    def get_page_size(self, request):
        return 10

Esta es mi configuración de marco de descanso

REST_FRAMEWORK = {
    'UPLOADED_FILES_USE_URL':
    True,
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.FileUploadParser',
        'rest_framework.parsers.FormParser',
    ],
    "TIME_FORMAT":
    "%I:%M %p",
    "TIME_INPUT_FORMATS": ["%I:%M %p", "%H:%M"],
}

Creo que puedo estar haciendo algo mal pero no puedo encontrar el error.



------------------------------------

Sí, esto probablemente fue una tontería, pero de todos modos descubrí el problema. El problema no estaba en las dos vistas dadas, así que no proporcioné la información adecuada aquí. Después de escribir el comentario anterior, comencé a buscar si estoy anulando el tamaño de la página en otro lugar Entonces encontré esto

class FocusView(ListAPIView):
    authentication_classes = (JWTAuthentication, TokenAuthentication,
                              SessionAuthentication, BasicAuthentication)
    permission_classes = (IsAuthenticated, IsCustomer, )
    renderer_classes = (
        JSONRenderer,
       
    )
    pagination_class = StandardResultsSetPagination
    serializer_class = FocusTileSerializer
    pagination_class.page_size=100 #this line was the culprit here

Esta vista está justo debajo de la vista que usé arriba, por lo que cuando el servidor recarga, Python carga todos los módulos y archivos, por lo que esta vista anula el tamaño de página del paginador personalizado. Realmente no sé si se supone que debe hacerlo. hazlo, pero seguramente debería mencionarse en los documentos o tal vez me lo perdí.



------------------------------------

No veo ningún error en la paginación personalizada, aunque no es necesario anular el método get. Intente configurar la clase de paginación predeterminada en la configuración.

REST_FRAMEWORK = {
    'UPLOADED_FILES_USE_URL':
    True,
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.FileUploadParser',
        'rest_framework.parsers.FormParser',
    ],
    "TIME_FORMAT":
    "%I:%M %p",
    "TIME_INPUT_FORMATS": ["%I:%M %p", "%H:%M"],
    'DEFAULT_PAGINATION_CLASS': 'your.path.StandardResultsSetPagination'
}

También se menciona en la documentación: paginación DRF

PD: compruebe también el conjunto de consultas y el conjunto de vistas; es posible que el error se deba a la consulta en la que está obteniendo los resultados.

2

Sí, tal vez eso funcione, pero estoy literalmente pensando por qué lo dado no funciona; además, cuando intenté imprimir self.page_size en el método get, estaba imprimiendo 100, como si el fn estuviera desafiando el leyes de la herencia misma.

Kunal Solanke

29 de marzo de 2021 a las 4:23

¡Jaja, qué bueno que hayas encontrado el error! :) Te sugiero que establezcas una configuración predeterminada y la anules más tarde

-Neeraj

29 de marzo de 2021 a las 9:31

randomThread
bash - ¿Cómo puedo buscar en file1.txt y file2.txt caracteres coincidentes e imprimir la salida en un nuevo archivo?javascript - Reposicionar la barra de herramientas del editor de texto quillc# - Entity Framework 6. Truncar automáticamente los campos de cadena que exceden la longitud del campo DBc# - ¿Por qué filtrar este IEnumerable arroja una excepción NullReferenceException?Python - Pillow: ¿Cómo rellenar con degradado las formas dibujadas?go - Cómo agregar dinámicamente una columna al contenedor.NewGridWithColumns()Python - Cómo validar la entrada de tkinterhtml: uso de consulta de medios para ejecutar