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 Solanke29 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
-Neeraj29 de marzo de 2021 a las 9:31