python - route - django rest framework serializer
Django Rest Framework: active la paginaciĆ³n en un ViewSet(como la paginaciĆ³n ModelViewSet) (4)
Intente proporcionar una variable de clase
paginate_by = 10 #This will paginate by 10 results per page.
Cree un conjunto de ViewSet
personalizado que solo realice operaciones de list
como su caso en este momento.
class ListModelViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
pass
Ahora hereda tu clase Foo
con este viewset personalizado
class Foo(ListModelViewSet):
paginate_by = 10
def list(self, request):
queryset = User.objects.all()
serializer = UserSerializer(queryset, many=True)
return Response(serializer.data)
Esto debería ayudarlo a que funcione la paginación.
Tengo un ViewSet como este para listar los datos de los usuarios:
class Foo(viewsets.ViewSet):
def list(self, request):
queryset = User.objects.all()
serializer = UserSerializer(queryset, many=True)
return Response(serializer.data)
Quiero activar la paginación como la paginación predeterminada para ModelViewSet:
{
"count": 55,
"next": "http://myUrl/?page=2",
"previous": null,
"results": [{...},{...},...,{...}]
}
El documento oficial dice:
La paginación solo se realiza automáticamente si está utilizando vistas genéricas o conjuntos de vistas
... pero mi conjunto de resultados no está paginado en absoluto. ¿Cómo puedo paginarlo?
La paginación solo se realiza automáticamente si está utilizando vistas genéricas o conjuntos de vistas
El primer obstáculo es traducir los documentos al inglés. Lo que intentaron transmitir es que usted desea un viewset genérico. Los viewsets genéricos se extienden desde ApiViews genéricos que tienen métodos de clase extra para paginar querysets y respuestas.
Además, está proporcionando su propio método de list
, pero el proceso de paginación predeterminado es realmente manejado por el mixin :
class ListModelMixin(object):
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
La solución fácil, use el código de marco:
class Foo(mixins.ListModelMixin, viewsets.GenericViewSet):
queryset = User.objects.all()
serializer = UserSerializer
La solución más compleja sería si necesita un método de list
personalizado, luego debe escribirlo como mejor le parezca, pero en el estilo del fragmento de código de mezcla anterior.
Para aquellos que usan DRF 3.1 o superior, están cambiando la forma predeterminada de manejar la paginación. Ver http://www.django-rest-framework.org/topics/3.1-announcement/ para más detalles.
Ahora, si desea habilitar la paginación para un ModelViewSet, puede hacerlo globalmente configurando su archivo settings.py:
REST_FRAMEWORK = {
''DEFAULT_PAGINATION_CLASS'': ''rest_framework.pagination.PageNumberPagination'',
''PAGE_SIZE'': 100
}
O si solo lo quiere para un ModelViewSet, puede establecer manualmente la clase_paginación solo para ese conjunto de vistas.
from rest_framework.pagination import PageNumberPagination
class StandardResultsSetPagination(PageNumberPagination):
page_size = 100
page_size_query_param = ''page_size''
max_page_size = 1000
class FooViewSet(viewsets.ModelViewSet):
pagination_class = StandardResultsSetPagination
Esto también le permite modificar la forma en que se maneja la paginación para ese conjunto de vistas.
DRF 3.1 también ha introducido nuevos tipos de esquemas de paginación predeterminados que puede usar, como LimitOffset y Cursor.
Paginación en DRF usando viewsets y list
Aquí he manejado una excepción. Si la página está vacía, mostrará registros vacíos.
Al definir definir el tamaño de la página, este tamaño de página es global y es utilizado por paginator_queryset en la vista
REST_FRAMEWORK = {''PAGE_SIZE'': 10,}
A la vista de rest_framework import mixins, viewsets
class SittingViewSet(viewsets.GenericViewSet,
mixins.ListModelMixin):
serializer_class = SittingSerializer
queryset = Sitting.objects.all()
serializer = serializer_class(queryset, many=True)
def list(self, request, *args, **kwargs):
queryset =self.filter_queryset(Sitting.objects.all().order_by(''id''))
page = request.GET.get(''page'')
try:
page = self.paginate_queryset(queryset)
except Exception as e:
page = []
data = page
return Response({
"status": status.HTTP_404_NOT_FOUND,
"message": ''No more record.'',
"data" : data
})
if page is not None:
serializer = self.get_serializer(page, many=True)
data = serializer.data
return self.get_paginated_response(data)
# serializer = self.get_serializer(queryset, many=True)
return Response({
"status": status.HTTP_200_OK,
"message": ''Sitting records.'',
"data" : data
})
**> Nota: si no usa Order_by, mostrará una excepción porque esta lista
da una lista desordenada. **