首页 > 其他分享 >DRF过滤、排序、异常处理、自定义Response、分页

DRF过滤、排序、异常处理、自定义Response、分页

时间:2022-11-27 21:47:45浏览次数:33  
标签:None 自定义 Response book 过滤 data class DRF

DRF过滤、排序、异常处理、自定义Response、分页

目录

过滤

# pip安装
# settings.py注册
# 全局配置
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.backends.DjangoFilterBackend'],
}

class NewNewBooksView(ListAPIView):
    filter_fields = ('name',)
    queryset = Book.objects.all()
    serializer_class = NewBookModelSerializer

re_path('books/v5/', views.NewNewNewBooksView.as_view()),

# 在路由配置中无需正则分组即可从类似http://127.0.0.1:8000/books/v5/?name=《456》的URL中提取过滤条件

注意:继承APIView或者View的视图类是不受过滤影响的,继承了GenericAPIView类或者其子类的视图类才受过滤影响

局部过滤

# 一般情况下都是局部过滤,直接在视图类中配置即可
class NewNewNewBooksView(ListAPIView, CreateAPIView):
    authentication_classes = []
    throttle_classes = []

    filter_backends = [DjangoFilterBackend] # 配置过滤类
    filter_fields = ('name',) # 配置过滤字段
    queryset = Book.objects.all()
    serializer_class = NewBookModelSerializer

排序

# 全局使用
class NewNewNewBooksView(ListAPIView, CreateAPIView):
    authentication_classes = []
    throttle_classes = []

    filter_backends = [DjangoFilterBackend,OrderingFilter]
    filter_fields = ('id','price')
    queryset = Book.objects.all()
    serializer_class = NewBookModelSerializer

http://127.0.0.1:8000/books/v5/?ordering=-id
http://127.0.0.1:8000/books/v5/?ordering=price

异常处理

def app01_exception_handler(exc, context):
    response = exception_handler(exc, context)
    if not response:
        return Response(data={'status': 1, 'msg': str(exc)}, status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response(data={'status': 2, 'msg': response.data.get('detail')}, status=status.HTTP_400_BAD_REQUEST)

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'app01.views.app01_exception_handler',
}

封装Response对象

class APIResponse(Response):
    def __init__(self, code=100, msg='成功', data=None, status=None, headers=None, content_type=None,**kwargs):
        dict = {'code': code, 'msg': msg}
        if data:
            dict = {'code': code, 'msg': msg, 'data': data}
        dict.update(kwargs)
        super().__init__(data=dict, status=None,headers=None,
                         exception=False, content_type=None)
book_ser = BookModelSerializer(instance=book,data=request.data,partial=True) # 部分修改

分页

三种分页方式

from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination

PageNumberPagination

from rest_framework.pagination import PageNumberPagination,
class BookView(ListAPIView):
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    pagination_class = PageNumberPagination
REST_FRAMEWORK = {
    'PAGE_SIZE': 2,
}

# page_size 即'PAGE_SIZE'
# page_query_param 即URL中的页码key
# page_size_query_param 指定为'size'即可在URL中传入size参数控制索取条数
# max_page_size 硬性规定每页最大条数
# 可以通过如下继承改变参数值

LimitOffsetPagination

from rest_framework.pagination import LimitOffsetPagination
class MYLimitOffsetPagination(LimitOffsetPagination):
    default_limit = settings.REST_FRAMEWORK['PAGE_SIZE'] # 每页数据条数
    limit_query_param = 'limit' # 指定每页条数的key
    offset_query_param = 'offset' # 相对起始位置偏移量,offset=2则从第三条开始取
    max_limit = None # 每页最大条数
class BookView(ListAPIView):
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    pagination_class = MYLimitOffsetPagination

CursorPagination

from rest_framework.pagination import CursorPagination
class MYLimitOffsetPagination(CursorPagination):
    cursor_query_param = 'cursor' # 过滤key
    page_size = 3 # 每页条数
    ordering = '-id' # 排序字段
class BookView(ListAPIView):
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    pagination_class = MYLimitOffsetPagination

# 只有向前向后两个按钮,无法跳跃到某一页或者某一条数据,但是相比上面两种效率更高

使用APIView创建视图类时分页

class BooksAPIView(APIView):
    def get(self, request, *args, **kwargs):
        book_list = models.Book.objects.filter(is_delete=False)
        page_cursor = PageNumberPagination()
        book_list = page_cursor.paginate_queryset(book_list,request,view=self)
        book_list_ser = BookModelSerializer(book_list, many=True)
        return Response(data=book_list_ser.data)

标签:None,自定义,Response,book,过滤,data,class,DRF
From: https://www.cnblogs.com/missfxy/p/16930676.html

相关文章

  • Django自定义系列
    Django自定义系列目录Django自定义系列模板层-自定义过滤器、标签、inclusion_tag自定义过滤器(最多两个参数)自定义过滤器调用自定义标签(可以有多个参数)自定义标签调用自定......
  • Java Excel导出动态自定义单元格样式
    根据表格内容定义单元格样式效果图:文章描述两种,一种创建生成时定义样式,另一种在excel在写入文件前修改样式关键代码一/***数据动态设置样式*......
  • jquery011-自定义函数-执行
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><bodystyle="width:980px;margin:0auto"><h1>例子1</h1><......
  • jquery010-自定义-自执行-封闭
    一,jQuery扩展:-$.extend({函数名:function(){}})$.方法-$.fn.extend({函数名:function(){}})......
  • Zoteron自定义引文样式
    前言要使用的参考文献格式与Zotero官方的略有不同,生成后逐个修改又太麻烦,所以对样式文件根据个人需求做了修改,在此感谢原作者的贡献(每个位置都标有注释,好评!)修改内容1.......
  • comsol中绘制出自定义变量的时间曲线
         ......
  • NUXT3自定义IP和端口
    NUXT3自定义IP和端口前期准备1,一个NUXT3项目2,nodejs版本建议14.x.x以上我使用的是最新版本19.x.x3,nodejs全局安装cross-env,如未安装,执行以下命令npm......
  • cpp 实现自定义更改文件名
    任务要求:指定文件夹中只有两种文件,png图片和txt文件。如果有一对png图片和txt文件的文件名相同,则将png图片的文件名更改为txt文件的内容。细节要求:1、txt只有一行,由多......
  • WGCLOUD搭建笔记 - 指令下发和自定义监测项有什么区别
    ​​​WGCLOUD​​监控系统有两个功能模块:指令下发和自定义监测项话说,WGCLOUD确实一款非常优秀的运维软件,轻量且性能好言归正传,那么它们两个有什么区别呢1、指令下发指令下......
  • PostgreSQL常用操作合辑:时间日期、系统函数、正则表达式、库表导入导出、元数据查询、
    〇、参考地址1、pg官方文档http://www.postgres.cn/docs/9.6/index.html2、腾讯云仓pg文档https://cloud.tencent.com/document/product/878/335713、阿里云数据库RDS......