• Django DRF 排序、过滤


    1. 排序

    排序只在查询所有的功能接口中使用,对查询的结果进行排序(升序、降序)

    REST framework 提供了 OrderingFilter 过滤器来帮助我们快速指明数据按照指定字段进行排序
    
    • 1

    导入语句:from rest_framework.filters import OrderingFilter

    使用

    • 需要在视图类中添加俩个属性视图类必须是继承了 GenericAPIView
    filter_backends = [OrderingFilter, ]	# 引入过滤器
    ordering_fields = ['price', 'id']		# 按照指定字符排序
    
    • 1
    • 2
    • 接口路由中使用,如下示例
    # 按price升序
    http://127.0.0.1:8000/api/v1/books?ordering=price  
    
    # 按price降序,负号表示降序
    http://127.0.0.1:8000/api/v1/books?ordering=-price 
    
    # 先按价格升序排,若价格一样,再按id升序排
    http://127.0.0.1:8000/api/v1/books?ordering=price,id 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2. 过滤

    过滤是指查找出符合指定要求的数据。

    SearchFilter 内置过滤器

    该内置的过滤是模糊查询,但是不能指定查询字段,
    导入语句:from rest_framework.filters import SearchFilter

    使用

    • 需要在视图类中添加俩个属性视图类必须是继承了 GenericAPIView
    filter_backends = [SearchFilter, ]	# 引入过滤器
    search_fields = ['price', 'id']		# 按照指定字符查找
    
    • 1
    • 2
    • 接口路由中使用,如下示例
    http://127.0.0.1:8000/api/v1/books?search=11  # 相当于在上面指定的price和id中模糊查找
    
    • 1

    DjangoFilterBackend 第三方过滤器

    该过滤器属于第三方过滤器,需要手动下载:pip3 install django-filter
    下载好后导入语句:from django_filters.rest_framework import DjangoFilterBackend

    使用

    • 需要在视图类中添加俩个属性视图类必须是继承了 GenericAPIView
    filter_backends = [DjangoFilterBackend, ]	# 引入过滤器
    filter_fields = ['price', 'id']				# 按照指定字符排序
    
    • 1
    • 2
    • 接口路由中使用,如下示例
    http://127.0.0.1:8000/api/v1/books?price=123&price=11  
    
    • 1

    自定义过滤器

    除了以上的过滤器还可以自定义过滤器,编写自己的逻辑。

    • 首先继承 BaseFilterBackend
    • 重写 filter_queryset 方法
    • 在视图类中配置
    from rest_framework.filters import BaseFilterBackend
    from django.db.models import Q
    
    class MyFilter(BaseFilterBackend):
        def filter_queryset(self, request, queryset, view):
            q_obj = Q()
            q_obj.connector = 'and'
            for i in request.query_params:
                j = request.query_params.get(i)
                q_obj.children.append((i, j))
            return queryset.filter(q_obj)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    Linux库的认知与使用
    设计模式——结构型模式——责任链模式
    Redis服务
    CTF/AWD竞赛标准参考书+实战指南:《AWD特训营》
    短视频矩阵系统软件源码
    SpringCloudAlibaba组件 — — OpenFeign的其他作用【超时时间、日志打印】
    CentOS7自有服务和软件包
    【硬核攻略】SQL Server全接触:手把手教你驾驭数据库巨轮,驶向高效查询的星辰大海!
    mybatis基础
    mybatis源码阅读系列(一)
  • 原文地址:https://blog.csdn.net/m0_58987515/article/details/125398942