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')

测试如下:
在这里插入图片描述