如何在Django Rest Framework中的动作内进行分页 [英] How to Paginate within an action in Django Rest Framework

查看:88
本文介绍了如何在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

enter image description here

action

enter image description here

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆