drf篇:排序、过滤,自定义过滤

  • 排序
  • 过滤

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
posted @ 2022-06-21 22:41  马氵寿  阅读(273)  评论(0)    收藏  举报