views.py视图中搜索search_fields 、排序ordering_fields 、过滤filter_backends 、分页pagination_class 的设置和使用方法

news/2025/11/14 16:50:01/文章来源:https://www.cnblogs.com/ludundun/p/19222644
import jsonfrom django.http import HttpResponse, JsonResponse, HttpRequest# Create your views here.
from django.urls import reverse
from django.views import View
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.request import Request
from rest_framework import filters
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
from rest_framework.parsers import JSONParser, FormParser, MultiPartParserfrom .models import Project
# from .serializers import ProjectSerializer
from . import serializers
from .filters import ProjectFilter
from utils.pagination import PageNumberPagination# class ProjectDetailView(View):
# class ProjectDetailView(APIView):
class ProjectDetailView(GenericAPIView):serializer_class = serializers.ProjectModelSerializer2queryset = Project.objects.all()def get_serializer_class(self):if self.request.method == 'GET':return serializers.ProjectModelSerializer1else:return self.serializer_classdef get(self, request, pk):"""数据校验过程数据库操作过程序列化输出过程:param request::param pk::return:"""instance = self.get_object()serializer = self.get_serializer(instance=instance)return Response(serializer.data, status=status.HTTP_200_OK)def put(self, request, pk):"""反序列化输入过程数据校验过程数据库操作过程序列化输出过程:param request::param pk::return:"""serializer = self.get_serializer(data=request.data, instance=self.get_object())# if not serializer.is_valid():#     return JsonResponse(serializer.errors, status=400, json_dumps_params={'ensure_ascii': False})serializer.is_valid(raise_exception=True)serializer.save()return Response(serializer.data, status=status.HTTP_201_CREATED)def delete(self, request, pk):"""数据校验过程数据库操作过程:param request::param pk::return:"""instance = self.get_object()instance.delete()return Response(None, status=204)# class ProjectView(View):
# class ProjectView(APIView):
class ProjectView(GenericAPIView):"""可以继承DRF中的APIView视图1.APIView为View的子类2.每一个实例方法的第二个参数为Request对象3.Request在Django的HttpRequest之上做了拓展》与HttpRequest中解析参数的方法完全兼容》解析查询字符串参数:GET   ->  query_params》解析application/x-www-form-urlencoded参数:POST   ->  data》解析application/json参数:body   ->  data》解析multipart/form-data参数:POST、FILES   ->  data4.提供了认证、授权、限流功能5.返回DRF中的Response》为HttpResponse子类》可以自动根据请求头中的Accept字段,返回相应格式的数据》data接受序列化输出的数据(字典、嵌套字典的列表)》status指定响应状态码》headers修改响应头信息(字典)6.解析器类》提供针对请求头中Content-Type参数,自动解析请求参数》默认的解析器有三种:JSONParser(application/json)、FormParser(application/x-www-form-urlencoded)、MultiPartParser(multipart/form-data)》有两种方式可以修改使用的解析器类:方式一:全局settings.py中REST_FRAMEWORK -> DEFAULT_PARSER_CLASSES中指定需要使用的解析器类方式二:在具体某个类视图中指定parser_classes类属性(列表),优先级高于方式一7.渲染器类》提供针对请求头中Accept参数,自动选择需要的渲染器,将数据以特定的格式返回》默认的渲染器类有二种:JSONRenderer(application/json)、BrowsableAPIRenderer(text/html)如果未指定Accept或者指定的Accept不为text/html,默认返回json数据》有两种方式可以修改使用的解析器类:方式一:全局settings.py中REST_FRAMEWORK -> DEFAULT_RENDERER_CLASSES中指定需要使用的渲染器类方式二:在具体某个类视图中指定renderer_classes类属性(列表),优先级高于方式一8.GenericAPIView类视图》是APIView的子类,继承了APIView所有功能(认证、授权、限流、Request、Response、解析器、渲染器)》提供了获取列表数据的相关功能(过滤、排序、分页)》往往需要指定queryset类属性(定义当前类视图操作的查询集对象)》往往需要指定serializer_class类属性(定义了当前类视图使用的公共序列化器类)》使用get_queryset()方法获取queryset类属性、使用get_serializer()方法获取serializer_class类属性》提供了get_object()方法,获取某一个模型对象》在定义url路由时,指定接收主键值的关键字参数名称,默认为pk,如果不为pk的话,必须重写lookup_url_kwarg》一般lookup_field类属性不需要修改(默认为pk),指定的是过滤模型对象时,使用的关键词参数名称9.实现搜索过滤功能》指定过滤引擎,有两种方式方式一:在全局settings.py中指定DEFAULT_FILTER_BACKENDS(列表,指定过滤引擎的绝对路径字符串)方式二:在类视图中filter_backends类属性(列表,指定过滤引擎的引用),优先级高于全局》必须指定search_fields类属性,定义待校验的字段(模型类中的字段名字符串),默认忽略大小写的包含过滤'^': 'istartswith','=': 'iexact','@': 'search','$': 'iregex',》如果不指定search_fields类属性,不会进行搜索过滤》调用视图的filter_queryset()方法,对查询集进行过滤,需要接收queryset查询集参数》在全局settings.py中使用SEARCH_PARAM参数指定前端过滤查询参数(默认为search)10.实现排序过滤功能》指定过滤引擎,有两种方式方式一:在全局settings.py中指定DEFAULT_FILTER_BACKENDS(列表,指定过滤引擎的绝对路径字符串)方式二:在类视图中filter_backends类属性(列表,指定过滤引擎的引用),优先级高于全局》必须指定ordering_fields类属性,定义支持排序的字段(模型类中的字段名字符串)》如果不指定ordering_fields类属性,那么支持由 serializer_class 属性指定的序列化器上的任何可读字段进行排序》指定ordering_fields = '__all__',指定视图应允许对模型的所有字段进行排序》指定ordering类属性,定义默认的排序字段;也可以 Projects.objects.all().order_by('name')》调用视图的filter_queryset()方法,对查询集进行过滤,需要接收queryset查询集参数》在全局settings.py中使用ORDERING_PARAM参数指定前端过滤查询参数(默认为ordering)11.实现分页功能》指定分页引擎类,有两种方式方式一:在全局settings.py中指定DEFAULT_PAGINATION_CLASS(指定分页引擎的绝对路径字符串)方式二:在类视图中pagination_class类属性(指定分页引擎的引用),优先级高于全局》必须在settings.py中DEFAULT_PAGINATION_CLASS指定PAGE_SIZE参数(指定默认每一页显示的数据条数)或者在自定义分页引擎类指定page_size参数,如果未指定,那么分页功能不会开启》在获取列表数据实例方法中调用paginate_queryset方法,需要接收queryset查询集对象,会返回嵌套page对象的列表》调用get_paginated_response方法将分页数据返回,需要接收serializer.data参数》如果需要开启前端能够指定获取每一页的数据条数,往往需要重写分页引擎类PageNumberPagination》page_size指定默认每一页数据条数》page_query_param设置前端指定页码的查询字符串参数名称》page_query_description,对前端指定页码的查询字符串参数的中文描述》必须重写page_size_query_param类属性,才能开启前端能够指定获取每一页的数据条数的功能》page_size_query_description是page_size_query_param类属性的中文描述》max_page_size指定前端每一页数据最大条数的最大值》如果需要定制分页数据的返回,那么就需要重写get_paginated_response方法需求:1、需要实现对于项目操作的5个接口a.创建一条项目数据POSTb.更新一条项目数据PUTc.删除一条项目数据DELETEd.获取一条项目数据(获取详情数据)GETe.获取所有项目数据(获取列表数据)GET2.对于url与请求方法有如下要求GET /projects/              获取所有的项目数据(将所有的项目数据以json数组形式返回)POST /projects/             创建一条项目数据(前端需要以json形式传递项目参数,创建成功之后将项目数据以json对象形式返回)"""# parser_classes = [FormParser, MultiPartParser]# renderer_classes = [JSONRenderer]serializer_class = serializers.ProjectModelSerializer2queryset = Project.objects.all()# queryset = Project.objects.all().order_by('-id')# search_fields = ['=name', '^leader', '$desc']search_fields = ['name', 'leader', 'desc', 'interfaces__name']""" search_fields 搜索字段模糊匹配设置# 给drf框架搜索引擎支持搜索的字段,见settings.py文件中的REST_FRAMEWORK全局设置# http://localhost/projects/?search=100进行模糊匹配,支持查询name字段中包含100,leader字段中包含100,desc字段中包含100,项目所关联的接口名称中包含100的内容全部搜索出来如果需求中有了变更,需要支持其他字段的搜索,那么就在这个search_fields列表中增加该字段即可,同理不需要搜索某字段,直接删除该字段即可,实现了配置的可插拔操作。# interfaces__name关联字段,当前项目关联的接口名称,interfaces项目的models.py文件中Interfaces模型类中,# projects字段设置的关联字段设置的是related_name='interfaces',所以项目表中通过interfaces__name 就能查询到所有相关的接口名称9.实现搜索过滤功能》指定过滤引擎,有两种方式方式一:在全局settings.py中指定DEFAULT_FILTER_BACKENDS(列表,指定过滤引擎的绝对路径字符串)方式二:在类视图中filter_backends类属性(列表,指定过滤引擎的引用),优先级高于全局》必须指定search_fields类属性,定义待校验的字段(模型类中的字段名字符串),默认忽略大小写的包含过滤'^': 'istartswith','=': 'iexact','@': 'search','$': 'iregex',》如果不指定search_fields类属性,不会进行搜索过滤》调用视图的filter_queryset()方法,对查询集进行过滤,需要接收queryset查询集参数》在全局settings.py中使用SEARCH_PARAM参数指定前端过滤查询参数(默认为search)"""# 过滤搜索和过滤排序设置,filter_backends 搜索过滤设置,使用drf框架中filters的SearchFilter和OrderingFilter类进行实现filter_backends = [filters.SearchFilter, filters.OrderingFilter]filter_fields = ['name', 'desc', 'is_execute']""" filter_fields特定字段精确匹配过滤设置,# 请求示例:http://localhost/projects/?name=zhangsanfeng2222# filter_backends 过滤搜索和过滤排序设置,使用drf框架中filters的SearchFilter和OrderingFilter类进行实现10.实现排序过滤功能》指定过滤引擎,有两种方式方式一:在全局settings.py中指定DEFAULT_FILTER_BACKENDS(列表,指定过滤引擎的绝对路径字符串)方式二:在类视图中filter_backends类属性(列表,指定过滤引擎的引用),优先级高于全局》必须指定ordering_fields类属性,定义支持排序的字段(模型类中的字段名字符串)》如果不指定ordering_fields类属性,那么支持由 serializer_class 属性指定的序列化器上的任何可读字段进行排序》指定ordering_fields = '__all__',指定视图应允许对模型的所有字段进行排序》指定ordering类属性,定义默认的排序字段;也可以 Projects.objects.all().order_by('name')》调用视图的filter_queryset()方法,对查询集进行过滤,需要接收queryset查询集参数》在全局settings.py中使用ORDERING_PARAM参数指定前端过滤查询参数(默认为ordering)"""# filterset_class = ProjectFilter# filterset_class自定义的过滤器类,因django-filter和当前的python以及drf版本不一致,无法使用该插件,# 虽然可以实现各种各样复杂的过滤规则,但是也不太推荐了,查询出来的结果可以让前端人员进行查询渲染pagination_class = PageNumberPagination""" pagination_class分页过滤设置11.实现分页功能》指定分页引擎类,有两种方式方式一:在全局settings.py中指定DEFAULT_PAGINATION_CLASS(指定分页引擎的绝对路径字符串)方式二:在类视图中pagination_class类属性(指定分页引擎的引用),优先级高于全局》必须在settings.py中DEFAULT_PAGINATION_CLASS指定PAGE_SIZE参数(指定默认每一页显示的数据条数)或者在自定义分页引擎类指定page_size参数,如果未指定,那么分页功能不会开启》在获取列表数据实例方法中调用paginate_queryset方法,需要接收queryset查询集对象,会返回嵌套page对象的列表》调用get_paginated_response方法将分页数据返回,需要接收serializer.data参数》如果需要开启前端能够指定获取每一页的数据条数,往往需要重写分页引擎类PageNumberPagination》page_size指定默认每一页数据条数》page_query_param设置前端指定页码的查询字符串参数名称》page_query_description,对前端指定页码的查询字符串参数的中文描述》必须重写page_size_query_param类属性,才能开启前端能够指定获取每一页的数据条数的功能》page_size_query_description是page_size_query_param类属性的中文描述》max_page_size指定前端每一页数据最大条数的最大值》如果需要定制分页数据的返回,那么就需要重写get_paginated_response方法"""# ordering_fields 排序字段设置ordering_fields = ['name', 'id', 'leader']def get_serializer_class(self):if self.request.method == 'GET':return serializers.ProjectModelSerializer1else:return self.serializer_classdef get(self, request: Request):"""数据库操作过程序列化输出过程需求1(搜索过滤):将项目名称、项目负责人名称、项目描述中包含指定内容的项目过滤出来http://127.0.0.1:8000/projects/?search=100需求2(特定过滤):将项目名称包含指定内容的项目过滤出来http://127.0.0.1:8000/projects/?name=100:param request::return:"""queryset = self.get_queryset()# 需求1的实现# search_param = request.query_params.get('search')# instance_lst = []# if search_param is not None:#     instance_lst.extend(list(queryset.filter(name__icontains=search_param)))#     instance_lst.extend(list(queryset.filter(leader__icontains=search_param)))#     instance_lst.extend(list(queryset.filter(desc__icontains=search_param)))# serializer = self.get_serializer(instance=instance_lst, many=True)queryset = self.filter_queryset(queryset)# 需求2的实现# name_param = request.query_params.get('name')# if name_param is not None:#     queryset = queryset.filter(name__icontains=name_param)# 分页操作page = self.paginate_queryset(queryset)if page is not None:serializer = self.get_serializer(instance=page, many=True)return self.get_paginated_response(serializer.data)serializer = self.get_serializer(instance=queryset, many=True)return Response(data=serializer.data, status=status.HTTP_200_OK)def post(self, request: HttpRequest):"""反序列化输入过程数据校验过程数据库操作过程序列化输出过程request.query_paramsrequest.data:param request::return:"""serializer = self.get_serializer(data=request.data)serializer.is_valid(raise_exception=True)serializer.save()return Response(data=serializer.data, status=status.HTTP_201_CREATED)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/965524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Objective-C 使用YYModel配合AI工具高效创建iOS数据模型

在iOS开发中,数据模型(Model)的创建是一个常见且繁琐的任务。随着项目规模的增长,手动编写大量的Model类不仅耗时耗力,还容易出错。本文将介绍如何结合YYModel和AI工具,实现数据模型的快速、准确创建,真正达到&…

Pandas --Series序列

Pandas --Series序列一.什么是Seriespandas Series 是一个带有标签的一维数组,能够保存任何数据类型(整数、字符串、浮点数、Python对象等)。你可以将它想象成 Excel 表格中的一列,或者一个字典与列表的结合体。是…

B5819W-ASEMI可直接替代安世PMEG4010CEGW

B5819W-ASEMI可直接替代安世PMEG4010CEGW编辑:ll B5819W-ASEMI可直接替代安世PMEG4010CEGW ASEMI首芯半导体可替代安氏半导体功率器件 型号:B5819W 品牌:ASEMI 封装:SOD-123 正向电流:1A 反向电压:40V 正向压降:…

2025年液压强夯机生产厂家权威推荐榜单:装载机液压夯实机/冲击夯/高速液压强夯机源头厂家精选

在基建工程质量要求不断提升的背景下,液压强夯机凭借其高效能、强冲击和适应性广的特点,已成为现代地基处理工程中不可或缺的关键设备。 据行业数据显示,2025年高速液压夯实机市场的年需求增长率预计维持在12%以上。…

P3228 [HNOI2013] 数列

推式子可以得到答案为: \[n \times m^{k - 1} - (k - 1) \times m^{k - 2} \times \frac{m(m + 1)}{2} \]

深入解析:《从零搭建现代 Android 模块化架构项目(2025 最新实践)》

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

习题解析之:字符大小写转换

习题解析之:字符大小写转换【问题描述】 输入一个字符串,将其中大写字母转为小写,小写字母转为大写,其他字符保持原样,输出转换后的字符串。 输入格式输入一个字符串。 输出格式输出转换后的字符串。 示例输入: …

ASM指令做题记录

pwn.college 做题记录: 传送门 set-multiple-register点击查看代码memory read 初探地址。 .intel_syntax noprefix mov rax, 0x404000] memory write 题目要求我们把寄存器 rax 里的值存到 0x404000 地址里。

Java 并行编程

Java 并行编程 核心思想 当前计算机多为多CPU、多核架构,为充分发挥硬件性能,可将一个大任务拆分成多个独立小任务。这些小任务在不同处理器核心上并行执行,执行完成后合并结果,最终得到大任务的解决方案。 Fork/J…

11月第二周

11月第二周这是我第一次写实习收获,已经实习四个月了,还一次没写过,现在已经没那么小白了,所以打算整理一下之前所学,这次只是这一周的收获,不多,大多都是从带教和经理那里反馈的建议改进之后总结出的。期望坚持…

视频汇聚平台EasyCVR化解高速服务区管理难题,打造高速服务区的智慧监控方案

视频汇聚平台EasyCVR化解高速服务区管理难题,打造高速服务区的智慧监控方案一、方案背景 高速服务区作为高速公路的重要配套设施,承担着为过往司乘人员提供休息、餐饮、加油、维修等多样化服务的重要职责。随着交通流…

关于HTML中fontbis等字体标签对-物理字体-逻辑字体的介绍及说明

关于HTML中<font><b><i><s>等字体标签对-物理字体-逻辑字体的介绍及说明Posted on 2025-11-14 16:20 520_1351 阅读(0) 评论(0) 收藏 举报在HTML中 ,字体分为【物理字体】和【逻辑字体】…

Linux Shell脚本基础语法

Linux Shell脚本基础语法Shell 是指一种应用程序,用户通过这个程序访问操作系统内核的服务。Windows Explorer,图形界面shell Ken Thompson 的 sh,第一种Unix Shell Bourne Again Shell(/bin/bash) Shell 脚本一般…

不懂 Attention 不算懂 AI?十大奠基论文(一):一文读懂《Attention Is All You Need》

摘要 《Attention Is All You Need》论文开创性地提出Transformer架构,彻底改变了自然语言处理领域的技术路径。该论文解决了传统RNN/CNN模型的三大痛点:通过自注意力机制实现全局语义捕捉,摆脱了序列处理的低效性;…

2025年直埋保温管供货厂家权威推荐榜单:热力管道/夹克保温管/预制直埋保温管源头厂家精选

在城镇集中供热管网与工业热能输送系统持续建设的推动下,直埋保温管作为保障热能高效、安全传输的核心部件,其市场需求稳步增长。据行业报告预测,未来几年中国预制直埋保温管市场将保持稳定发展态势。 直埋保温管凭…

2025上海专业防水补漏推荐!Top5口碑公司实测,先检测后施工有保障

随着建筑防水需求的不断升级,市场对专业防水补漏服务的要求日益严苛。本榜单基于技术实力、服务范围、施工质量和客户口碑四大维度,结合行业数据与用户反馈,对上海地区主流防水补漏企业进行综合评测,为消费者和企业…

PCBA方案设计——充气泵的工作原理是什么?

充气泵的核心工作原理是通过动力源驱动气体压缩机构,将低压气体压缩为高压气体,再通过管路输送至目标对象,实现充气;部分机型可反向工作完成抽气,本质是“气体的压力/容积转换”过程。一、核心工作流程(充气模式…

Linux内核xarray数据结构采用

Linux内核xarray数据结构采用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

2025年通风气楼厂家权威推荐榜单:钢结构厂房气楼/顺坡气楼/排烟通风气楼源头厂家精选

在工业建筑绿色转型与安全生产要求不断提升的背景下,通风气楼作为工业厂房的“呼吸系统”,其技术含量与产品质量直接关系到生产环境的安全和能源消耗效率。 据QYResearch最新研究报告显示,2031年全球通风装置市场销…

楼宇间网络拓扑测绘 从原理到精准部署

楼宇间拓扑测绘的核心,是将网络连接关系精确定位到建筑物级别,为校园、园区等单位的网络规划与运维提供“高清地图”。 通过精准的楼宇级拓扑测绘,网络管理员能快速定位故障点、优化数据流路径,并为网络扩容提供决…