如何在Django Rest Framework中的动作内进行分页 [英] How to Paginate within an action in Django Rest Framework
问题描述
下午好,我对django rest框架页面有疑问,在这种情况下,我设法在视图集中做到了这一点,但是在集体诉讼中,我未能实现这一目标。
django rest框架中答案的附加图像
首先将响应数据移到它自己的函数中,因为您将使用它两次。更好的解决方案是为操作创建序列化器。
def get_response_data(paginated_queryset):
data = {
'id_interface':interface.id_interface,
'id_EquipoOrigen':interface.id_EquipoOrigen_id,
'EquipoOrigen':interface.id_EquipoOrigen.nombre,
'LocalidadOrigen':interface.id_EquipoOrigen.localidad,
'CategoriaOrigenE :: .categoria,
'id_PuertoOrigen':interface.id_PuertoOrigen_id,
'PuertoOrigen':interface.id_PuertoOrigen.nombre,
'estatus':interface.estatus,
'etiqueta_prtg':接口.etiqueta_prtg,
'grupo':interface.grupo,
'if_index':interface.if_index,
'bw':interface.bw,
'bw_al':interface.bw_al ,
'id_prtg':interface.id_prtg,
'ospf':interface.ospf,
'description':interface.description,
'id_EquipoDestino':interface.id_EquipoDestino_id,
'EquipoD estino':interface.id_EquipoDestino.nombre,
'LocalidadDestino':interface.id_EquipoDestino.localidad,
'CategoriaDestino':interface.id_EquipoDestino.categoria,
'id_PuertoDestino_:interface.id_ b $ b'PuertoDestino':interface.id_PuertoDestino.nombre,
'ultima_actualizacion':interface.ultima_actualizacion,
}用于查询集中的接口
返回数据
然后,您将使用与 mixins.ListModelMixin
内置的rest框架相同的方式进行分页。
@action(methods = ['get'],detail = False,url_path ='registros-data-table',url_name ='registros_data_table')
def registros_data_table(self,request):
queryset = Interfaces.objects.all()
页面= self.paginate_queryset(queryset)
如果页面不是None:
data = self.get_response_data(page)
return self.get_paginated_response(data)
data = self.get_response_data(queryset)
返回Response(data)
Good afternoon community, I have a question about the django rest framework page, in this case I manage to do it in the viewset, but in a class action I have not been able to achieve it.
Attached images of the answers in django rest framework
action
class PostPageNumberPagination(PageNumberPagination):
page_size=10
class InterfacesViewSet(viewsets.ModelViewSet):
queryset=Interfaces.objects.all()
serializer_class=InterfaceSerializer
pagination_class=PostPageNumberPagination
# La siguiente funcion es un decorador(funciones extra) de la clase RegistrosViewSet para poder manipular los datos que voy a presentar de acuerdo a la URL que se le asigne con el url_path
# El siguiente action actua para poder presentar todos los datos de todos los objetos
@action(methods=['get'],detail=False,url_path='registros-data-table',url_name='registros_data_table')
def registros_data_table(self, request):
paginator=PostPageNumberPagination
return Response(
{
'id_interface':interface.id_interface,
'id_EquipoOrigen':interface.id_EquipoOrigen_id,
'EquipoOrigen':interface.id_EquipoOrigen.nombre,
'LocalidadOrigen':interface.id_EquipoOrigen.localidad,
'CategoriaOrigen':interface.id_EquipoOrigen.categoria,
'id_PuertoOrigen':interface.id_PuertoOrigen_id,
'PuertoOrigen':interface.id_PuertoOrigen.nombre,
'estatus':interface.estatus,
'etiqueta_prtg':interface.etiqueta_prtg,
'grupo':interface.grupo,
'if_index':interface.if_index,
'bw':interface.bw,
'bw_al':interface.bw_al,
'id_prtg':interface.id_prtg,
'ospf':interface.ospf,
'description':interface.description,
'id_EquipoDestino':interface.id_EquipoDestino_id,
'EquipoDestino':interface.id_EquipoDestino.nombre,
'LocalidadDestino':interface.id_EquipoDestino.localidad,
'CategoriaDestino':interface.id_EquipoDestino.categoria,
'id_PuertoDestino':interface.id_PuertoDestino_id,
'PuertoDestino':interface.id_PuertoDestino.nombre,
'ultima_actualizacion':interface.ultima_actualizacion,
}
for interface in Interfaces.objects.all()
)
Update: I made the method provided by the friend @bdoubleu but I get that the objects are not being paginated, that is to say in all the pages the total amount of objects appears.
First move the response data out into it's own function because you will be using it twice. A better solution would be to create a serializer for the action.
def get_response_data(paginated_queryset):
data = {
'id_interface': interface.id_interface,
'id_EquipoOrigen': interface.id_EquipoOrigen_id,
'EquipoOrigen': interface.id_EquipoOrigen.nombre,
'LocalidadOrigen': interface.id_EquipoOrigen.localidad,
'CategoriaOrigen': interface.id_EquipoOrigen.categoria,
'id_PuertoOrigen': interface.id_PuertoOrigen_id,
'PuertoOrigen': interface.id_PuertoOrigen.nombre,
'estatus': interface.estatus,
'etiqueta_prtg': interface.etiqueta_prtg,
'grupo': interface.grupo,
'if_index': interface.if_index,
'bw': interface.bw,
'bw_al': interface.bw_al,
'id_prtg': interface.id_prtg,
'ospf': interface.ospf,
'description': interface.description,
'id_EquipoDestino': interface.id_EquipoDestino_id,
'EquipoDestino': interface.id_EquipoDestino.nombre,
'LocalidadDestino': interface.id_EquipoDestino.localidad,
'CategoriaDestino': interface.id_EquipoDestino.categoria,
'id_PuertoDestino': interface.id_PuertoDestino_id,
'PuertoDestino': interface.id_PuertoDestino.nombre,
'ultima_actualizacion': interface.ultima_actualizacion,
} for interface in queryset
return data
Then you would paginate in the same way as in rest framework's built in mixins.ListModelMixin
.
@action(methods=['get'],detail=False,url_path='registros-data-table',url_name='registros_data_table')
def registros_data_table(self, request):
queryset = Interfaces.objects.all()
page = self.paginate_queryset(queryset)
if page is not None:
data = self.get_response_data(page)
return self.get_paginated_response(data)
data = self.get_response_data(queryset)
return Response(data)
这篇关于如何在Django Rest Framework中的动作内进行分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!