这是我参与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')
复制代码
结语
文章首发于微信公众号程序媛小庄,同步于掘金。
码字不易,转载请说明出处,走过路过的小伙伴们伸出可爱的小指头点个赞再走吧(╹▽╹)