Django DRF 排序、过滤

文章目录

    • 1. 排序
    • 2. 过滤
      • SearchFilter 内置过滤器
      • DjangoFilterBackend 第三方过滤器
      • 自定义过滤器

1. 排序

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

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

导入语句:from rest_framework.filters import OrderingFilter

使用

  • 需要在视图类中添加俩个属性视图类必须是继承了 GenericAPIView
filter_backends = [OrderingFilter, ]	# 引入过滤器
ordering_fields = ['price', 'id']		# 按照指定字符排序
  • 接口路由中使用,如下示例
# 按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 

2. 过滤

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

SearchFilter 内置过滤器

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

使用

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

DjangoFilterBackend 第三方过滤器

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

使用

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

自定义过滤器

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

  • 首先继承 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)

你可能感兴趣的:(Django,框架,django,python,后端)