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')
测试如下:
 