转自 https://zhuanlan.zhihu.com/p/291842599
Django-drf-第三方过滤\排序功能
Ⅰ 内置过滤功能 -- SearchFilter
过滤:筛选查询结果
在视图类中配置
from rest_framework.filters import SearchFilter # 导入模块
class listbook(ListAPIView):
queryset = Student.objects.all()
serializer_class = StudentSerializer
# 筛选功能
filter_backends = [SearchFilter, ] # 局部使用配置
search_fields = ('name',) # 筛选的字段
访问方式 -- search关键字传筛选条件
http://127.0.0.1:8000/students/?search=wot
Ⅱ 第三方拓展的过滤功能 -- DjangoFilterBackend
借助于django-filter
- 注意:最新版本(2.4.0)要跟django2.2以上搭配
在视图类中配置
from django_filters.rest_framework import DjangoFilterBackend
class listbook(ListAPIView):
queryset = Student.objects.all()
serializer_class = StudentSerializer
# 筛选功能
filter_backends = [DjangoFilterBackend, ] # 第三方的筛选类
filter_fields = ['name',] # 只查询name字段,精准匹配
filter_fields = ['name', 'age'] # 查询name字段和age字段,精准匹配
访问方式 -- (name)字段名关键字传筛选条件
http://127.0.0.1:8000/book/?name=wot&age=13 # 多个查询条件
http://127.0.0.1:8000/book/?name=wot # 单个查询条件
Ⅲ 排序功能 -- OrderingFilter
根据指定字段对查询结果进行排序
在视图类中配置
from rest_framework.filters import OrderingFilter
class listbook(ListAPIView):
queryset = Student.objects.all()
serializer_class = StudentSerializer
# 排序功能
filter_backends = [OrderingFilter, ]
ordering__fields = ['id', ] # 这里是id,访问时同样可以传入age进行排序
访问方式 -- ordering关键字传筛选条件
http://127.0.0.1:8000/book/?ordering=-id # 以id倒序排列,传表模型字段
http://127.0.0.1:8000/book/?ordering=-age # 以年龄倒序排列,视图类未设置,同样由效
Ⅳ 筛选后排序 -- DjangoFilterBackend, OrderingFilter
先以什么什么筛选 or 以什么什么排序再进行筛选
先筛选后排序
在视图类中配置
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
class listbook(ListAPIView):
queryset = Student.objects.all()
serializer_class = StudentSerializer
# 筛选功能
filter_backends = [DjangoFilterBackend,OrderingFilter ]
filter_fields = ['name', ]
# 排序功能
ordering__fields = ['id', ]
访问方式 -- name=筛选条件&ordering=排序字段
http://127.0.0.1:8000/book/?name=wot&ordering=age
发