DRF --- 过滤
过滤的URL规范: https://abc.com/api/v2/students/?sno=95001
https://abc.com/api/v2/students/?name=李&mobile=1234
安装:pip install django-filter
注册到installed_apps中
- # rest framework 全局设置
- REST_FRAMEWORK = {
- # 过滤
- 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
- }
- # ============= 导入模块 ==============
- from django_filters import FilterSet, filters
- from studentweb.models import Faculty, Major, Student
-
-
- # --- Faculty的Filter类 ---
- class FacultyFilter(FilterSet):
- # 重新需要支持模糊匹配的字段
- name = filters.CharFilter(field_name='name', lookup_expr="icontains")
-
- class Meta:
- model = Faculty
- fields = ('name', )
-
-
- # --- Major的Filter类 ---
- class MajorFilter(FilterSet):
- # 重新需要支持模糊匹配的字段
- name = filters.CharFilter(field_name='name', lookup_expr="icontains")
-
- class Meta:
- model = Major
- fields = ('name', 'faculty')
-
-
- # --- Student的Filter类 ---
- class StudentFilter(FilterSet):
- sno = filters.CharFilter(field_name='sno', lookup_expr="icontains")
- name = filters.CharFilter(field_name='name', lookup_expr="icontains")
- mobile = filters.CharFilter(field_name='mobile', lookup_expr="icontains")
- major = filters.CharFilter(field_name='major')
- faculty = filters.CharFilter(field_name='major__faculty')
-
- class Meta:
- model = Student
- fields = ('sno', 'name', 'mobile', 'major')
- from django.shortcuts import render
- from rest_framework.viewsets import ModelViewSet
- from studentweb.models import Faculty,Major,Student
- from studentweb.serializer import FacultySerialzer,MajorSerialzer,StudentSerialzer
- from django_filters.rest_framework import DjangoFilterBackend # 实现筛选的后台模块
- from django_filters import FilterSet, filters
- from studentweb.filter import FacultyFilter,MajorFilter,StudentFilter
- from rest_framework.response import Response
- from rest_framework import status
- from rest_framework.decorators import action
- # Create your views here.
-
-
- # Faculty视图
- class FacultyViewSet(ModelViewSet):
- """
- create:
- 创建院系信息
- retrieve:
- 获取院系信息详情数据
- update:
- 完整更新院系信息
- partial_update:
- 部分更新院系信息
- destroy:
- 删除院系信息
- list:
- 获取所有院系信息
- """
- queryset = Faculty.objects.all()
- serializer_class = FacultySerialzer
- filterset_fields = ('name',)
-
-
-
- # --- Major视图---
- class MajorViewSet(ModelViewSet):
- """
- create:
- 创建专业信息
- retrieve:
- 获取专业信息详情数据
- update:
- 完整更新专业信息
- partial_update:
- 部分更新专业信息
- destroy:
- 删除专业信息
- list:
- 获取所有专业信息
- """
- queryset = Major.objects.all()
- serializer_class = MajorSerialzer
- filterset_fields = ('name', 'faculty')
- #filter_class = MajorFilter
-
-
- # --- Student视图---
- class StudentViewSet(ModelViewSet):
- """
- create:
- 创建学生信息
- retrieve:
- 获取学生信息详情数据
- update:
- 完整更新学生信息
- partial_update:
- 部分更新学生信息
- destroy:
- 删除学生信息
- list:
- 获取所有学生信息
- """
-
- queryset = Student.objects.all()
- serializer_class = StudentSerialzer
- filter_backends = (DjangoFilterBackend,)
- #filterset_fields = ('sno', 'name', 'mobile', 'email', 'major')
- #filter_class = StudentFilter
- # 自定义模糊搜索
- # http://127.0.0.1:8000/api/v1/students/?name=王
- # http://127.0.0.1:8000/api/v1/students/?name=&son=&mobile=18900998909
- filterset_class = StudentFilter
- # # 设置筛选后台
- # filter_backends = (DjangoFilterBackend,)
- #
- # # 指定筛选的类
- # # 指定筛选的类
- # filter_class = StudentFilter
- # # 指定查找匹配的字段 --- 学号、姓名、电话、邮箱、地址
- # search_fields = ('sno', 'name', 'mobile', 'email', 'address')



- # --- Student视图---
- class StudentViewSet(ModelViewSet):
- """
- create:
- 创建学生信息
- retrieve:
- 获取学生信息详情数据
- update:
- 完整更新学生信息
- partial_update:
- 部分更新学生信息
- destroy:
- 删除学生信息
- list:
- 获取所有学生信息
- """
-
- queryset = Student.objects.all()
- serializer_class = StudentSerialzer
-
- #filterset_fields = ('sno', 'name', 'mobile', 'email', 'major')
- # 自定义模糊搜索
- # http://127.0.0.1:8000/api/v1/students/?name=王
- # http://127.0.0.1:8000/api/v1/students/?name=&son=&mobile=18900998909
- filterset_class = StudentFilter
- # # 设置筛选后台
-
- # # 指定筛选的类
- # # 指定查找匹配的字段 --- 学号、姓名、电话、邮箱、地址
- search_fields = ('sno', 'name', 'mobile', 'email', 'address')
- # rest framework 全局设置
- REST_FRAMEWORK = {
- # 过滤 搜索
- 'DEFAULT_FILTER_BACKENDS': (
- 'django_filters.rest_framework.DjangoFilterBackend',
- 'rest_framework.filters.SearchFilter'
-
- ),
- }


分页

- # rest framework 全局设置
- REST_FRAMEWORK = {
- # 过滤 搜索
- 'DEFAULT_FILTER_BACKENDS': (
- 'django_filters.rest_framework.DjangoFilterBackend',
- 'rest_framework.filters.SearchFilter'
-
- ),
- # 分页
- 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
- 'PAGE_SIZE': 10
-
- }

已经全局设置10条了
- http://127.0.0.1:8000/api/v1/students/?page=1&size=5
- {
- "count": 15,
- "next": "http://127.0.0.1:8000/api/v1/students/?page=2&size=5",
- "previous": null,
- "results": [
- {
- "sno": "0000",
- "name": "林锡鸿",
- "gender": "男",
- "birthday": "2022-09-01T21:42:00Z",
- "mobile": "15625775964",
- "email": "411856938@qq.com",
- "address": "珠海",
- "image": "",
- "major": 1
- },
- {
- "sno": "950001",
- "name": "王晓宇",
- "gender": "男",
- "birthday": "2022-03-01T00:00:00Z",
- "mobile": "13099881122",
- "email": "wangxiaoyu@qq.com",
- "address": "上海市闵行区春都路88号",
- "image": "",
- "major": 2
- },
- {
- "sno": "950002",
- "name": "陈鹏",
- "gender": "男",
- "birthday": "2001-12-08T00:00:00Z",
- "mobile": "18809871288",
- "email": "chenpeng@qq.com",
- "address": "南京市鼓楼区北京东路88号",
- "image": "http://192.168.182.140:8000/media/images/4ec342ef63994d8da66bb2390718bb9b.webp",
- "major": 24
- },
- {
- "sno": "950003",
- "name": "王艳",
- "gender": "女",
- "birthday": "2002-09-02T00:00:00Z",
- "mobile": "17712344321",
- "email": "wangyan@gmail.com",
- "address": "上海市徐汇区漕宝路22号",
- "image": "",
- "major": 1
- },
- {
- "sno": "950004",
- "name": "李明奇",
- "gender": "男",
- "birthday": "2002-03-01T00:00:00Z",
- "mobile": "13877612312",
- "email": "limingqi@abc.com",
- "address": "上海市徐汇区龙漕路89号",
- "image": "",
- "major": 3
- },
- {
- "sno": "950005",
- "name": "杨晓彤",
- "gender": "女",
- "birthday": "2002-03-01T00:00:00Z",
- "mobile": "15565435564",
- "email": "yangxiaotong@sohu.com",
- "address": "上海市闵行区金都路1200号",
- "image": "",
- "major": 5
- },
- {
- "sno": "950006",
- "name": "王一超",
- "gender": "男",
- "birthday": "2002-03-01T00:00:00Z",
- "mobile": "18900998909",
- "email": "wangyichao@qq.com",
- "address": "上海市闵行区银都路118号",
- "image": "",
- "major": 6
- },
- {
- "sno": "950007",
- "name": "陈旭",
- "gender": "男",
- "birthday": "2002-03-01T00:00:00Z",
- "mobile": "13312344543",
- "email": "chenxu@263.com",
- "address": "上海市闵行区清红路812号",
- "image": "",
- "major": 7
- },
- {
- "sno": "950008",
- "name": "曾霞",
- "gender": "女",
- "birthday": "2002-03-01T00:00:00Z",
- "mobile": "16612389078",
- "email": "zengxia@hotmail.com",
- "address": "南京市溧水区宝塔路88号",
- "image": "",
- "major": 8
- },
- {
- "sno": "950009",
- "name": "张三丰",
- "gender": "男",
- "birthday": "2002-03-01T00:00:00Z",
- "mobile": "18876341209",
- "email": "zhang@88.com",
- "address": "江苏省泰州市姜堰区华港镇254号",
- "image": "",
- "major": 9
- }
- ]
- }
设置分页类
- # -*- coding: utf-8 -*-
- from rest_framework.pagination import PageNumberPagination
-
- class MyPageNumberPagination(PageNumberPagination):
- page_size = 5
- page_query_param = "page"
- page_size_query_param = "size"
- max_page_size = 50
- queryset = Student.objects.all()
- serializer_class = StudentSerialzer
- pagination_class = MyPageNumberPagination
-
- #filterset_fields = ('sno', 'name', 'mobile', 'email', 'major')
- # 自定义模糊搜索
- # http://127.0.0.1:8000/api/v1/students/?name=王
- # http://127.0.0.1:8000/api/v1/students/?name=&son=&mobile=18900998909
- filterset_class = StudentFilter
- # # 设置筛选后台
-
- # # 指定筛选的类
- # # 指定查找匹配的字段 --- 学号、姓名、电话、邮箱、地址
- search_fields = ('sno', 'name', 'mobile', 'email', 'address')
- http://127.0.0.1:8000/api/v1/students/?page=1&size=5
- {
- "count": 15,
- "next": "http://127.0.0.1:8000/api/v1/students/?page=2&size=5",
- "previous": null,
- "results": [
- {
- "sno": "0000",
- "name": "林锡鸿",
- "gender": "男",
- "birthday": "2022-09-01T21:42:00Z",
- "mobile": "15625775964",
- "email": "411856938@qq.com",
- "address": "珠海",
- "image": "",
- "major": 1
- },
- {
- "sno": "950001",
- "name": "王晓宇",
- "gender": "男",
- "birthday": "2022-03-01T00:00:00Z",
- "mobile": "13099881122",
- "email": "wangxiaoyu@qq.com",
- "address": "上海市闵行区春都路88号",
- "image": "",
- "major": 2
- },
- {
- "sno": "950002",
- "name": "陈鹏",
- "gender": "男",
- "birthday": "2001-12-08T00:00:00Z",
- "mobile": "18809871288",
- "email": "chenpeng@qq.com",
- "address": "南京市鼓楼区北京东路88号",
- "image": "http://192.168.182.140:8000/media/images/4ec342ef63994d8da66bb2390718bb9b.webp",
- "major": 24
- },
- {
- "sno": "950003",
- "name": "王艳",
- "gender": "女",
- "birthday": "2002-09-02T00:00:00Z",
- "mobile": "17712344321",
- "email": "wangyan@gmail.com",
- "address": "上海市徐汇区漕宝路22号",
- "image": "",
- "major": 1
- },
- {
- "sno": "950004",
- "name": "李明奇",
- "gender": "男",
- "birthday": "2002-03-01T00:00:00Z",
- "mobile": "13877612312",
- "email": "limingqi@abc.com",
- "address": "上海市徐汇区龙漕路89号",
- "image": "",
- "major": 3
- }
- ]
- }