1 排序
# 排序功能接口只针对于:获取所有接口
from rest_framework.filters import OrderingFilter, SearchFilter
# 继承了GenericAPIView的视图类,只要加入,两个类属性
class BookView(GenericViewSet, ListModelMixin):
serializer_class = BookSerializer
queryset = Book.objects.all()
filter_backends = [OrderingFilter, ]
ordering_fields = ['price','id' ]
# 访问的时候
http://127.0.0.1:8000/api/v1/books?ordering=price # 按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 # 先按价格升序排,价格一样,再按id升序排
2 过滤
# 查询名字为三毛流浪记的所有图书:获取所有接口
from rest_framework.filters import OrderingFilter, SearchFilter
# 内置的过滤使用---》不能指定查询那个字段,模糊查询
-继承了GenericAPIView的视图类,只要加入,两个类属性
class BookView(GenericViewSet, ListModelMixin):
serializer_class = BookSerializer
queryset = Book.objects.all()
filter_backends = [SearchFilter,]
search_fields=['name','price'] # 按name或price过滤
-使用
http://127.0.0.1:8000/api/v1/books?search=三毛流浪记
# search= xx ----》具体查询是 name like xx or price like xx
# 我们想http://127.0.0.1:8000/api/v1/books?name=三毛流浪记&price=12---》第三方django-filter
-安装:pip3 install django-filter
-继承了GenericAPIView的视图类,只要加入,两个类属性
from django_filters.rest_framework import DjangoFilterBackend
class BookView(GenericViewSet, ListModelMixin):
serializer_class = BookSerializer
queryset = Book.objects.all()
filter_backends = [DjangoFilterBackend, ]
filter_fields = ['name', 'price']
-使用
http://127.0.0.1:8000/api/v1/books?name=三毛流浪记&price=11
# 自定义过滤器---》完成更多查询操作
-写一个类,继承BaseFilterBackend
-重写filter_queryset方法
from rest_framework.filters import BaseFilterBackend
class FilterName(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
# 返回的数据,就是过滤后的数据
# 从请求地址中去除过滤条件,对queryset进行过滤,返回
name = request.query_params.get('name')
return queryset.filter(name__contains=name)
-配置在视图类中
from .throttling import FilterName
class BookView(GenericViewSet, ListModelMixin):
serializer_class = BookSerializer
queryset = Book.objects.all()
filter_backends = [FilterName, ]
# 既有过滤又有排序
class BookView(GenericViewSet, ListModelMixin):
serializer_class = BookSerializer
queryset = Book.objects.all()
filter_backends = [FilterName, OrderingFilter]
ordering_fields = ['price', ]
# 源码分析,为什么这么配置就生效
-GenericAPIView的方法
def filter_queryset(self, queryset):
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset