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不起作用。

  • 需要注册应用
1
2
3
4
python复制代码INSTALLED_APPS = [
...
'django_filters', # 需要注册应用,
]
  • 全局配置/局部配置
1
2
3
4
5
6
7
8
9
python复制代码# 全局配置
REST_FRAMEWORK = {
...
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

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

# 127.0.0.1:8000/four/students/?sex=1

代码实例

  • 全局配置
1
python复制代码'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
  • 视图类
1
2
3
4
5
python复制代码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中指明。

1
2
3
4
5
6
7
8
9
python复制代码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字段进行升序排序

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
python复制代码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')

结语

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

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

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%