django-restframework 实现筛选,搜索
django-restframework 实现筛选(单个) 搜索(多个条件)
pip install django-filter -i https://pypi.tuna.tsinghua.edu.cn/simple
然后在配置文件中注册
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'django_filters',# drf的筛选
'studentweb',
]
配置筛选类
from django_filters import FilterSet
from studentweb.models import *
class FacultyFilter(FilterSet):
class Meta:
model = Faculty
fields = ('name',)
class MajorFilter(FilterSet):
class Meta:
model = Major
fields = ('name','faculty')
class StudentFilter(FilterSet):
class Meta:
model = Student
fields = ('sno','name','mobile')
在views中导入模块
# 实现筛选的后台模块
from django_filters.rest_framework import DjangoFilterBackend
# 导入筛选类
from studentweb.filter import FacultyFilter,MajorFilter,StudentFilter
默认该查询是不支持模糊匹配的,所以要进行优化
from django_filters import FilterSet, filters
from studentweb.models import *
class FacultyFilter(FilterSet):
# 重写需要支持模糊匹配的字段
name = filters.CharFilter(field_name='name', lookup_expr='icontains')
class Meta:
model = Faculty
fields = ('name',)
class MajorFilter(FilterSet):
# 重写需要支持模糊匹配的字段
name = filters.CharFilter(field_name='name', lookup_expr='icontains')
class Meta:
model = Major
fields = ('name', 'faculty')
class StudentFilter(FilterSet):
# 重写需要支持模糊匹配的字段
name = filters.CharFilter(field_name='name', lookup_expr='icontains')
# 重写需要支持模糊匹配的字段
sno = filters.CharFilter(field_name='sno', lookup_expr='icontains')
# 重写需要支持模糊匹配的字段
mobile = filters.CharFilter(field_name='mobile', lookup_expr='icontains')
class Meta:
model = Student
fields = ('sno', 'name', 'mobile')
如果要查询某一个时间段那应该怎样做?
每一个筛选后台都要写一段代码,应该怎样优化?
我们可以在setting配置文件中进行全局的设置
REST_FRAMEWORK = {
# 设置全局的filter_backend
'DEFAULT_FILTER_BACKENDS':[
"django_filters.rest_framework.DjangoFilterBackend",
]
}
view.py
from rest_framework.viewsets import ModelViewSet
from studentweb.models import *
from studentweb.serializer import *
from django_filters.rest_framework import DjangoFilterBackend
from studentweb.filter import FacultyFilter, MajorFilter, StudentFilter
class FacultyViewSet(ModelViewSet):
queryset = Faculty.objects.all()
serializer_class = FacultySerialzer
# 指定筛选的类
filter_class = FacultyFilter
class MajorViewSet(ModelViewSet):
queryset = Major.objects.all()
serializer_class = MajorSerialzer
# 指定筛选的类
filter_class = MajorFilter
class StudentViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSerialzer
# 指定筛选的类
filter_class = StudentSerialzer
测试
DRF中实现搜索功能
以Student 为例
class StudentViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSerialzer
# 设置查找的后台功能
filter_backends = (StudentFilter,)
# 指定筛选的类
filter_class = StudentFilter
# 设置查找功能
search_fields= ('sno','name','mobile')
这时可能筛选的功能就没了,所以搜索也要加入全局配置
REST_FRAMEWORK = {
# 设置全局的filter_backend
'DEFAULT_FILTER_BACKENDS':[
"django_filters.rest_framework.DjangoFilterBackend",
"rest_framework.filters.SearchFilter"
]
}
class StudentViewSet(ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSerialzer
# 指定筛选的类
filter_class = StudentFilter
# 设置查找功能
search_fields = ('sno','name','mobile')
测试如下: