Django restframwork实现自定义数据格式的分页与搜索

最近因为在做分页时遇到的问题很多,页浪费了好多时间,所以记录一下。以后如遇到可用省去不必要的麻烦

restframwork中的官方文档对分页和搜索页进行了详细的介绍,但是我公司需要的return的json数据格式进行分层。所以吧,一个很简单的东西,搞的头皮发嘛,看源码之类的,费时,重点是看不太懂,但最后还是参考源码,重写了response方法。

直接上代码了

url(r'^show_workPublished',views.Show_workPublishedView.as_view(),name='show_workPublished'),

serializer.py

class Show_workPublishedModelSerialiazer(serializers.ModelSerializer):

    class Meta:
        model = Upload_filep
        #fields = ("id","name","title","img")
        fields = ["id","name","title","img",'address','add_time']

自定义分页pagination.py

from rest_framework.pagination import PageNumberPagination

class PNPageination(PageNumberPagination):
    page_size = 6  # 每页显示2条
    page_query_param = 'currentPage'  # 当前页
    page_size_query_param = 'page_size'  # 每页显示

view.py

class Show_workPublishedView(generics.ListAPIView):
    queryset = Upload_filep.objects.all().order_by('id').reverse()
    pagination_class = PNPageination
    serializer_class = Show_workPublishedModelSerialiazer

    #模糊搜索
    def get_queryset(self):
        name = self.request.GET.get('keyword')
        if name is not None:
            return self.queryset.filter(Q(name__icontains=name) | Q(title__icontains=name))
        return self.queryset

    def get(self,request,*args,**kwargs):
        list = self.get_queryset()
        #list = Upload_filep.objects.all()
        list_nums = list.count()
        try:
            page = request.GET.get('currentPage',1)
        except PageNotAnInteger:
            page = 1
        limit = int(request.GET.get('limit',6))

        p = Paginator(list,limit)
        lists = p.page(page)

        #lists_serializer = Show_workPublishedModelSerialiazer(lists,many=True)
        lists_serializer = self.get_serializer(lists,many=True)

        ret = {
                   "result": True,
                   "msg": "successful",
                   "secure": False,
                   "returnCode": "200",

                   "data": {
                         "list":{
                             "listData":lists_serializer.data,

                             "page_size":limit,                 #每页显示两个
                             "totalCount":list_nums ,           # 一共有多少数据
                             "totalPage": (list_nums//limit if list_nums%limit==0 else list_nums//limit+1) ,   # 一共有多少页    a-b if a>b else a+b
                             "currentPage": page ,               # 当前页数
                         },
                   },
              }
        return Response(ret)
View Code

 

到这里就能搞定分页和搜索。restframwork分装的比较多,但有的东西还是得参考源码重写方法。

转载于:https://www.cnblogs.com/shaojiafeng/p/9681652.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值