DRF 过滤和排序规则

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

过滤

过滤的安装

过滤功能不是django rest_framwork内置的,需要安装第三方的包

pip install django-filter

注意:django-filter只能运行在django2.2版本及以上,如果你的电脑上装的django版本低于2.2版本,在安装django-filter的时候,会自动卸载电脑上的django重新安装最新版本的django及django-filter

过滤的基本使用

过滤就是在获取到全部信息的前提下对结果进行过滤,因此视图类只需要实现获取全部数据的功能即可,即视图类继承ListAPIView即可。

过滤的方式是在路由 ?字段=过滤条件

注意:

只有继承了GenericAPIView或者其他继承了GenericAPIView的子类或者需要搭配GenericAPIView的扩展类使用过滤才会有效果。如果自己在视图类中定义了获取所有数据的方法,由于内部没有filter_queryset方法就会导致filter不起作用。

  • 需要注册应用
INSTALLED_APPS = [
    ...
    'django_filters',  # 需要注册应用,
]
复制代码
  • 全局配置/局部配置
# 全局配置
REST_FRAMEWORK = {
    ...
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

# 局部配置
from django_filters.rest_framework import DjangoFilterBackend
filter_backends = [DjangoFilterBackend,]
复制代码
  • 在视图中添加filter_fields属性,指定可以过滤的字段
class StudentListView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    filter_fields = ('age', 'sex')

# 127.0.0.1:8000/four/students/?sex=1
复制代码

代码实例

  • 全局配置
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
复制代码
  • 视图类
from rest_framework.generics import ListAPIView
class BookView(ListAPIView):
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    filter_fields = ('name','price')
复制代码

排序

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

使用方法:

在类视图中设置filter_backends,使用rest_framework.filters.OrderingFilter过滤器,REST framework会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,则按照ordering参数指明的排序字段对数据集进行排序。

前端可以传递的ordering参数的可选字段值需要在ordering_fiel ds中指明。

class StudentListView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    filter_backends = [OrderingFilter]
    ordering_fields = ('id', 'age')

# 127.0.0.1:8000/books/?ordering=-age
# -id 表示针对id字段进行倒序排序
# id  表示针对id字段进行升序排序
复制代码

如果需要在过滤以后再次进行排序,则需要两者结合!

from rest_framework.generics import ListAPIView
from students.models import Student
from .serializers import StudentModelSerializer
from django_filters.rest_framework import DjangoFilterBackend

class Student3ListView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    filter_fields = ('age', 'sex')
    '''
    在局部配置排序时使用的字段与过滤一致,而局部配置会覆盖全局配置,所以需要重新声明过滤组件,否则过滤组件会失效
    '''
    filter_backends = [OrderingFilter,DjangoFilterBackend]
    ordering_fields = ('id', 'age')
复制代码

结语

文章首发于微信公众号程序媛小庄,同步于掘金

码字不易,转载请说明出处,走过路过的小伙伴们伸出可爱的小指头点个赞再走吧(╹▽╹)

Guess you like

Origin juejin.im/post/7031724575457034277