首页 > 其他分享 >drf——基于apiview写过滤、排序和分页

drf——基于apiview写过滤、排序和分页

时间:2023-05-26 17:14:29浏览次数:55  
标签:name get apiview self list book import 排序 drf

基于APIView带过滤和排序

from rest_framework.views import APIView
from .models import Book
from .serializer import BookSerializer
from rest_framework.response import Response

class BookView(APIView):
    # /books/?ordering=-price&name=红楼梦
    def get(self,request):
        ordering = request.query_params.get('ordering')
        name = request.query_params.get('name')
        book_list = Book.objects.all()
        if ordering:
            book_list = book_list.order_by(ordering)
        if name:
            book_list = book_list.filter(name__contains=name)
        ser = BookSerializer(instance=book_list,many=True)
        return Response(ser.data)

基于APIView带过滤、排序和分页

from rest_framework.views import APIView
from .models import Book
from .serializer import BookSerializer
from rest_framework.response import Response
from .page import MyPageNumberPagination

class BookView(APIView):
    def get(self,request):
        ordering = request.query_params.get('ordering')
        name = request.query_params.get('name')
        book_list = Book.objects.all()
        if ordering:
            book_list = book_list.order_by(ordering)
        if name:
            book_list = book_list.filter(name__contains=name)
        # 加入分页
        pagination = MyPageNumberPagination()  # 自己写的分页类实例化得到对象
        page = pagination.paginate_queryset(book_list, request, self)
        ser = BookSerializer(instance=page,many=True)
        # return pagination.get_paginated_response(ser.data)
        return Response({
            'code':100,
            'msg':'成功',
            'count':pagination.page.paginator.count,
            'next':pagination.get_next_link(),
            'previous':pagination.get_previous_link(),
            'results':ser.data
        })
    
"""
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin
根据源码写自己的分页
配置的分页类的对象调用了page = self.paginate_queryset(queryset)

paginate_queryset是GenericAPIView中的
---->>>paginate_queryset(queryset, self.request, view=self)

所以可以在自己写的视图类下 先实例化出一个对象 去调用paginate_queryset
如果返回值不为空则进行序列化
if page is not None:
    # 把page进行了序列化
   serializer = self.get_serializer(page, many=True)
   # 实例化完之后调用get_paginated_response方法 继承的分页类中的方法
   return self.get_paginated_response(serializer.data)
 
即--->>>
return Response(OrderedDict([
            ('count', self.page.paginator.count),
            ('next', self.get_next_link()),
            ('previous', self.get_previous_link()),
            ('results', data)
        ]))
"""

标签:name,get,apiview,self,list,book,import,排序,drf
From: https://www.cnblogs.com/XxMa/p/17435242.html

相关文章

  • 算法之常见排序算法-冒泡排序、归并排序、快速排序
    对于编程中琳琅满目的算法,本人向来是不善此道也不精于此的,而说起排序算法,也只是会冒泡排序。还记得当初刚做开发工作面试第一家公司时,面试官便让手写冒泡排序(入职之后才知道,这面试官就是一个冒泡排序"病态"爱好者,逢面试必考冒泡排序-__-)。后来看吴军的一些文章,提到提高效率的关键就......
  • Algorithm_02--C#排序算法(升序)
    (升序)算法原理:通过重复比较和交换,使较大的元素逐渐“浮”到数组后面。具体步骤:1.比较相邻元素,如果第一个比第二大,就交换它们两个。2.对每一对相邻元素作同样的工作,从开始第一到结尾的最后一对。这样再最后的元素应该会是最大数。3.针对所有的元素重复以上的步骤,除了最后一个。......
  • drf——权限、认证源码分析、过滤、排序、分页
    权限、认证源码(了解)权限源码#继承了APIView才有的---》执行流程---》dispatch中的三大认证 self.initial(request,*args,**kwargs) #1.APIView的dispatch中self.initial(request,*args,**kwargs) definitial(self,request,*args,**kwargs):se......
  • drf过滤,drf排序,drf分页
    drf过滤:带过滤的接口只有:查询所有内置过滤类:http://127.0.0.1:8000/api/v1/books/?search=红http://127.0.0.1:8000/api/v1/books/?search=11此类查询类似于模糊查询fromrest_framework.filtersimportSearchFilterclassBookView(Gene......
  • drf-5个接口
    目录写接口前的准备1表模型序列化类一继承APIView+序列化类+Resonse写5个接口视图类路由二继承GenericAPIView+序列化类+Resonse写5个接口视图类路由三继承GenericAPIView+5个视图扩展类+序列化类+Response写接口视图类路由四基于视图子类写5个接口:9个视图子类--->视图......
  • 冒泡排序
    冒泡排序#include<stdio.h>intmain(){ints[10]={12,65,32,69,5,8,21,36,4,15};inti=0,j=0,c=0,b=0;intlen=sizeof(s)/sizeof(int);for(i=0;i<len;i++){printf("%d",s[i]);}printf("\n");for(j=0;j<len-1......
  • 选择排序算法之泛型优化
    选择排序算法工作原理:每一次从待排序的数据元素中选中最小的一个元素,然后,再从剩余未排序元素中继续寻找最小元素,将2个元素交换位置,就达到了已排序的元素一直是从小到大了。这个算法的时间复杂度为O(n²),空间复杂度为O(1)。/***@Author:翰林猿*@Description:选择排序*......
  • 归并排序Java版(图文并茂思路分析)
    归并排序工作原理:工作原理是将一个大问题分解成小问题,再将小问题分解成更小的。(乍一看就觉得是像一个递归)就像下图这样。然后不断的将其一份为二,分解成更小的排序。我们设一个函数叫MergeSort(arr,l,r)意思就是将arr数组下标为[l,r]之间的数进行排序。那么就开始不断的调用自......
  • drf-视图组件
    目录一视图之两个视图基类1.1APIView使用APIView+序列化类+Response写接口1.2GenericAPIView[通用视图类]1.2.1主要的属性或方法1.2.2推导GenericAPIView的封装1.2.3写5个接口二5个视图扩展类2.1方法2.2自己封装2.3源码2.4具体使用,写5个接口三9个视图子类3.1介绍1)Cre......
  • drf-路由组件
    目录一路由Routers1.1什么情况下使用自动生成路由1.2自动生成路由使用方法1.3代码演示视图函数路由一路由Routers路由写法有多种-原始写法-映射的写法:path('books/',BookView.as_view({'get':'list','post':'create'}))-自动生成路由1.1什么情况下使用自动生成路......