• Python Web开发 之 学生管理系统(2)[实现筛选,搜索,分页]


    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中

    1. # rest framework 全局设置
    2. REST_FRAMEWORK = {
    3. # 过滤
    4. 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
    5. }
    1. # ============= 导入模块 ==============
    2. from django_filters import FilterSet, filters
    3. from studentweb.models import Faculty, Major, Student
    4. # --- Faculty的Filter类 ---
    5. class FacultyFilter(FilterSet):
    6. # 重新需要支持模糊匹配的字段
    7. name = filters.CharFilter(field_name='name', lookup_expr="icontains")
    8. class Meta:
    9. model = Faculty
    10. fields = ('name', )
    11. # --- Major的Filter类 ---
    12. class MajorFilter(FilterSet):
    13. # 重新需要支持模糊匹配的字段
    14. name = filters.CharFilter(field_name='name', lookup_expr="icontains")
    15. class Meta:
    16. model = Major
    17. fields = ('name', 'faculty')
    18. # --- Student的Filter类 ---
    19. class StudentFilter(FilterSet):
    20. sno = filters.CharFilter(field_name='sno', lookup_expr="icontains")
    21. name = filters.CharFilter(field_name='name', lookup_expr="icontains")
    22. mobile = filters.CharFilter(field_name='mobile', lookup_expr="icontains")
    23. major = filters.CharFilter(field_name='major')
    24. faculty = filters.CharFilter(field_name='major__faculty')
    25. class Meta:
    26. model = Student
    27. fields = ('sno', 'name', 'mobile', 'major')
    1. from django.shortcuts import render
    2. from rest_framework.viewsets import ModelViewSet
    3. from studentweb.models import Faculty,Major,Student
    4. from studentweb.serializer import FacultySerialzer,MajorSerialzer,StudentSerialzer
    5. from django_filters.rest_framework import DjangoFilterBackend # 实现筛选的后台模块
    6. from django_filters import FilterSet, filters
    7. from studentweb.filter import FacultyFilter,MajorFilter,StudentFilter
    8. from rest_framework.response import Response
    9. from rest_framework import status
    10. from rest_framework.decorators import action
    11. # Create your views here.
    12. # Faculty视图
    13. class FacultyViewSet(ModelViewSet):
    14. """
    15. create:
    16. 创建院系信息
    17. retrieve:
    18. 获取院系信息详情数据
    19. update:
    20. 完整更新院系信息
    21. partial_update:
    22. 部分更新院系信息
    23. destroy:
    24. 删除院系信息
    25. list:
    26. 获取所有院系信息
    27. """
    28. queryset = Faculty.objects.all()
    29. serializer_class = FacultySerialzer
    30. filterset_fields = ('name',)
    31. # --- Major视图---
    32. class MajorViewSet(ModelViewSet):
    33. """
    34. create:
    35. 创建专业信息
    36. retrieve:
    37. 获取专业信息详情数据
    38. update:
    39. 完整更新专业信息
    40. partial_update:
    41. 部分更新专业信息
    42. destroy:
    43. 删除专业信息
    44. list:
    45. 获取所有专业信息
    46. """
    47. queryset = Major.objects.all()
    48. serializer_class = MajorSerialzer
    49. filterset_fields = ('name', 'faculty')
    50. #filter_class = MajorFilter
    51. # --- Student视图---
    52. class StudentViewSet(ModelViewSet):
    53. """
    54. create:
    55. 创建学生信息
    56. retrieve:
    57. 获取学生信息详情数据
    58. update:
    59. 完整更新学生信息
    60. partial_update:
    61. 部分更新学生信息
    62. destroy:
    63. 删除学生信息
    64. list:
    65. 获取所有学生信息
    66. """
    67. queryset = Student.objects.all()
    68. serializer_class = StudentSerialzer
    69. filter_backends = (DjangoFilterBackend,)
    70. #filterset_fields = ('sno', 'name', 'mobile', 'email', 'major')
    71. #filter_class = StudentFilter
    72. # 自定义模糊搜索
    73. # http://127.0.0.1:8000/api/v1/students/?name=王
    74. # http://127.0.0.1:8000/api/v1/students/?name=&son=&mobile=18900998909
    75. filterset_class = StudentFilter
    76. # # 设置筛选后台
    77. # filter_backends = (DjangoFilterBackend,)
    78. #
    79. # # 指定筛选的类
    80. # # 指定筛选的类
    81. # filter_class = StudentFilter
    82. # # 指定查找匹配的字段 --- 学号、姓名、电话、邮箱、地址
    83. # search_fields = ('sno', 'name', 'mobile', 'email', 'address')

     

     

     

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

     

     分页

     

    1. # rest framework 全局设置
    2. REST_FRAMEWORK = {
    3. # 过滤 搜索
    4. 'DEFAULT_FILTER_BACKENDS': (
    5. 'django_filters.rest_framework.DjangoFilterBackend',
    6. 'rest_framework.filters.SearchFilter'
    7. ),
    8. # 分页
    9. 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    10. 'PAGE_SIZE': 10
    11. }

     已经全局设置10条了

    1. http://127.0.0.1:8000/api/v1/students/?page=1&size=5
    2. {
    3. "count": 15,
    4. "next": "http://127.0.0.1:8000/api/v1/students/?page=2&size=5",
    5. "previous": null,
    6. "results": [
    7. {
    8. "sno": "0000",
    9. "name": "林锡鸿",
    10. "gender": "男",
    11. "birthday": "2022-09-01T21:42:00Z",
    12. "mobile": "15625775964",
    13. "email": "411856938@qq.com",
    14. "address": "珠海",
    15. "image": "",
    16. "major": 1
    17. },
    18. {
    19. "sno": "950001",
    20. "name": "王晓宇",
    21. "gender": "男",
    22. "birthday": "2022-03-01T00:00:00Z",
    23. "mobile": "13099881122",
    24. "email": "wangxiaoyu@qq.com",
    25. "address": "上海市闵行区春都路88号",
    26. "image": "",
    27. "major": 2
    28. },
    29. {
    30. "sno": "950002",
    31. "name": "陈鹏",
    32. "gender": "男",
    33. "birthday": "2001-12-08T00:00:00Z",
    34. "mobile": "18809871288",
    35. "email": "chenpeng@qq.com",
    36. "address": "南京市鼓楼区北京东路88号",
    37. "image": "http://192.168.182.140:8000/media/images/4ec342ef63994d8da66bb2390718bb9b.webp",
    38. "major": 24
    39. },
    40. {
    41. "sno": "950003",
    42. "name": "王艳",
    43. "gender": "女",
    44. "birthday": "2002-09-02T00:00:00Z",
    45. "mobile": "17712344321",
    46. "email": "wangyan@gmail.com",
    47. "address": "上海市徐汇区漕宝路22号",
    48. "image": "",
    49. "major": 1
    50. },
    51. {
    52. "sno": "950004",
    53. "name": "李明奇",
    54. "gender": "男",
    55. "birthday": "2002-03-01T00:00:00Z",
    56. "mobile": "13877612312",
    57. "email": "limingqi@abc.com",
    58. "address": "上海市徐汇区龙漕路89号",
    59. "image": "",
    60. "major": 3
    61. },
    62. {
    63. "sno": "950005",
    64. "name": "杨晓彤",
    65. "gender": "女",
    66. "birthday": "2002-03-01T00:00:00Z",
    67. "mobile": "15565435564",
    68. "email": "yangxiaotong@sohu.com",
    69. "address": "上海市闵行区金都路1200号",
    70. "image": "",
    71. "major": 5
    72. },
    73. {
    74. "sno": "950006",
    75. "name": "王一超",
    76. "gender": "男",
    77. "birthday": "2002-03-01T00:00:00Z",
    78. "mobile": "18900998909",
    79. "email": "wangyichao@qq.com",
    80. "address": "上海市闵行区银都路118号",
    81. "image": "",
    82. "major": 6
    83. },
    84. {
    85. "sno": "950007",
    86. "name": "陈旭",
    87. "gender": "男",
    88. "birthday": "2002-03-01T00:00:00Z",
    89. "mobile": "13312344543",
    90. "email": "chenxu@263.com",
    91. "address": "上海市闵行区清红路812号",
    92. "image": "",
    93. "major": 7
    94. },
    95. {
    96. "sno": "950008",
    97. "name": "曾霞",
    98. "gender": "女",
    99. "birthday": "2002-03-01T00:00:00Z",
    100. "mobile": "16612389078",
    101. "email": "zengxia@hotmail.com",
    102. "address": "南京市溧水区宝塔路88号",
    103. "image": "",
    104. "major": 8
    105. },
    106. {
    107. "sno": "950009",
    108. "name": "张三丰",
    109. "gender": "男",
    110. "birthday": "2002-03-01T00:00:00Z",
    111. "mobile": "18876341209",
    112. "email": "zhang@88.com",
    113. "address": "江苏省泰州市姜堰区华港镇254号",
    114. "image": "",
    115. "major": 9
    116. }
    117. ]
    118. }

    设置分页类

    1. # -*- coding: utf-8 -*-
    2. from rest_framework.pagination import PageNumberPagination
    3. class MyPageNumberPagination(PageNumberPagination):
    4. page_size = 5
    5. page_query_param = "page"
    6. page_size_query_param = "size"
    7. max_page_size = 50
    1. queryset = Student.objects.all()
    2. serializer_class = StudentSerialzer
    3. pagination_class = MyPageNumberPagination
    4. #filterset_fields = ('sno', 'name', 'mobile', 'email', 'major')
    5. # 自定义模糊搜索
    6. # http://127.0.0.1:8000/api/v1/students/?name=王
    7. # http://127.0.0.1:8000/api/v1/students/?name=&son=&mobile=18900998909
    8. filterset_class = StudentFilter
    9. # # 设置筛选后台
    10. # # 指定筛选的类
    11. # # 指定查找匹配的字段 --- 学号、姓名、电话、邮箱、地址
    12. search_fields = ('sno', 'name', 'mobile', 'email', 'address')
    1. http://127.0.0.1:8000/api/v1/students/?page=1&size=5
    2. {
    3. "count": 15,
    4. "next": "http://127.0.0.1:8000/api/v1/students/?page=2&size=5",
    5. "previous": null,
    6. "results": [
    7. {
    8. "sno": "0000",
    9. "name": "林锡鸿",
    10. "gender": "男",
    11. "birthday": "2022-09-01T21:42:00Z",
    12. "mobile": "15625775964",
    13. "email": "411856938@qq.com",
    14. "address": "珠海",
    15. "image": "",
    16. "major": 1
    17. },
    18. {
    19. "sno": "950001",
    20. "name": "王晓宇",
    21. "gender": "男",
    22. "birthday": "2022-03-01T00:00:00Z",
    23. "mobile": "13099881122",
    24. "email": "wangxiaoyu@qq.com",
    25. "address": "上海市闵行区春都路88号",
    26. "image": "",
    27. "major": 2
    28. },
    29. {
    30. "sno": "950002",
    31. "name": "陈鹏",
    32. "gender": "男",
    33. "birthday": "2001-12-08T00:00:00Z",
    34. "mobile": "18809871288",
    35. "email": "chenpeng@qq.com",
    36. "address": "南京市鼓楼区北京东路88号",
    37. "image": "http://192.168.182.140:8000/media/images/4ec342ef63994d8da66bb2390718bb9b.webp",
    38. "major": 24
    39. },
    40. {
    41. "sno": "950003",
    42. "name": "王艳",
    43. "gender": "女",
    44. "birthday": "2002-09-02T00:00:00Z",
    45. "mobile": "17712344321",
    46. "email": "wangyan@gmail.com",
    47. "address": "上海市徐汇区漕宝路22号",
    48. "image": "",
    49. "major": 1
    50. },
    51. {
    52. "sno": "950004",
    53. "name": "李明奇",
    54. "gender": "男",
    55. "birthday": "2002-03-01T00:00:00Z",
    56. "mobile": "13877612312",
    57. "email": "limingqi@abc.com",
    58. "address": "上海市徐汇区龙漕路89号",
    59. "image": "",
    60. "major": 3
    61. }
    62. ]
    63. }

  • 相关阅读:
    Flask框架中Jinja2模板中测试器(判断值类型)
    PLM、ERP 和 MES,制造业的三剑客
    数据库选型与优化:策略与技巧的探讨
    OPPO,被折叠的高端之路
    shiro-第二篇-整合springboot
    2.Mybatis XML 方法的基本用法
    数说故事携重磅产品入选胖鲸数字化创新产品
    app全屏广告变现,有哪些利弊?如何发挥全屏广告的变现潜力?
    ffplay使用dxva2实现硬解渲染
    使用python生成大量数据写入es数据库并查询操作2
  • 原文地址:https://blog.csdn.net/weixin_38107457/article/details/126633276