Django REST Framework中的序列化器类和视图类

序列化器类

一、Serializer序列化类

Serializer是DRF的序列化器基类,提供基本功能,使用Serializer类需要自己定义字段名称和类型。

BookSerializer(Serializer):name = serializers.CharField()price = serlializers.IntegerField()date = serlializers.DateField()

Serializer序列化器类初始化的时候的几个参数说明:
instance这个指从数据库中读取的记录对应的对象,用于显示或者编辑中的现有
many如果是true,则指传递了多个对象
data用于收集通过post传上来的字典,用于新增或者编辑中的更新
Serializer序列化器提供了一个.save()接口用于保存数据,这个函数里面通过判断instance是否有值来确定是新增还是更新,如果有值则调用self.update(),如果没有值则调用self.create(),这两个方法需要自己实现,以满足用户的新增或者修改的逻辑。

self.create(self, validated_data)
self.update(self, instance, validated_data)

实现了这两个方法后,在客户类里面需要新增或者保存的时候,只需统一的调用serializer.save()就可以了。

二、ModelSerializer类

使用ModelSerializer类,就不用再自己定义字段名称和类型了,直接给出模型名称,指出需要序列化的字段即可。

BookSerializer(ModelSerlizer):class Meta:model	= Bookfields	= [“name”, “date”] # 这里可以自己定义需要的字段,__all__表示所有字段,也可以自己定义字段名称

使用ModelSerlializer类也不需要再自己定义create()和update()方法了,ModelSerlializer类已经实现了这两个函数的定义。

视图类

django里面的视图实际上是业务逻辑存放的地方,也就是“功能”,并不是页面样式。
而业务的功能无非就是这5种:增、删、改、查(列表)、查(详情)
DRF里面提供了三大类的类:API、mixin、ViewSet,API类的类提供接口(get、post、put、update、delete),mixin提供功能,ViewSet负责包装。

一、CBV视图,基于类的视图

django的原生视图是基于函数的,也就是FBV。CBV是基于类的,继承自View类。View类中有两个重要的函数:

View.dispatch()
View.as_view()

在View.as_view()函数中,又定义了一个子函数view(),as_view()会返回这个函数。在基于函数(FBV)的视图模式中,urls.py文件中指向的就是函数,而在基于类的视图(CBV)中,urls.py文件中指向的是类的as_view()函数,注意这里是加了括号的,就是说是要直接执行这个函数的,而这个函数的执行结果,是里面的子函数vews()。子view()函数会调用View.dispatch()函数,用于通过反射,指向在客户类中定义的get(),post(),put(),delete()等http方法的函数。
提示:CBV相对于FBV,改变了函数的组织形式,FBV是自己定义函数,通过路径找到该函数。CBV是统一使用http的method,用过method名称(get、post、put、update、delete),找到以该名称定义的函数,实现增删改查查。这也就是RESTFul。

二、APIView

APIView(View)类中也定义了以下两个函数:

APIView.dispatch()
APIView.as_view()

其中,as_view()函数调用了csrf_exempt()函数用来处理跨域请求
使用APIView类也需要自己定义:get(),post(),put(),delete()等http方法函数。
相比django原生的CBV,这里的dispatch()函数包装了request,提供了一个用于API的强大的request。另外还初始化了三个基础功能:认证、权限、限流
提示:相对于基本CBV,APIView定制了request,专门用于API应用。另外还调用了三个基础功能:认证、权限、限流。

三、通用视图类GenericAPIView

通用视图类GenericAPIView(APIView)
引入了两个变量:
queryset表示数据集
serializer_class 表示序列化器类
get、post、put、delete等函数还需要有
提示:
1、这个类需要配合其他类,通过多继承的方式使用。
2、有了数据集和序列化器类,我们还需要操作这些数据的方法:get、post、put…,下面的mixin系类分别定义了这些方法。以便根据自己的需求组合使用。

四、mixin混合类

mixins 是一种代码复用机制,允许我们将多个组件共享的逻辑提取到一个独立的对象中,从而提高代码的可维护性和重用性。
这里新增了以下几个类:CreateModelMixin、ListModelMixin、RetrieveModelMixin、UpdateModelMixin、DestroyModelMixin,每一个类里面只实现了类名称中动词的方法。
名称里都有model,就是操作model,实现了和数据库交互的具体逻辑。
注意这里的5个方法和增删改查查中的5个方法(get、post、put、update、delete)名称不一致,需要再定义一下增删改查查方法,然后只需要在具体方法内返回对应的mixin方法即可。
例如,CreateModelMixin类实现了create方法,可以实现对数据库的增加操作
ListModelMixin类实现了list方法,可以实现对数据库的查询操作
RetrieveModelMixin类实现了retrieve方法,可以实现对数据库的查询操作
UpdateModelMixin类实现了update方法,可以实现对数据库的修改操作
DestroyModelMixin类实现了destroy方法,可以实现对数据库的删除操作
使用方法:在视图类中继承GenericAPIView类和以上几个类,然后在视图类中定义queryset和serializer_class属性
最后在urls.py中配置路径
例如:
urls.py

urlpatterns = [path('houseku/', HouseKuList.as_view()),
]

views.py

class HouseKuList(generics.ListCreateAPIView, generics.GenericAPIView):queryset = HouseKu.objects.all()serializer_class = HouseKuSerializer# 这里还要写get、post、delete等函数,用于对应Mixin里面的list、create等def get(self, request):return self.list(request) def post(self, request):return self.create(request)

提示:GenericAPIView提供了queryset、serializer_class,mixin混合类提供了方法(但这些方法不对应的method名称)这两个组合在一起,就实现了相应的功能。

五、Mixin再封装,优化后的APIView

Mixin里面实现了list、create等方法,但是并没有对应http的method,DRF实现了进一步封装,创造了以下类:
ListCreateAPIView、RetrieveUpdateDestroyAPIView、ListAPIView、CreateAPIView、RetrieveAPIView、UpdateAPIView、DestroyAPIView
这里面的每一个类,实际上就是继承了对应的mixin类和GenericAPIView类,所以只要赋值给queryset、serializer_class就实现了一个完整的功能,如下:

class HouseKuViewSet(generics.ListCreateAPIView):queryset = HouseKu.objects.all()serializer_class = HouseKuSerializer

提示:每一个类都是完整的顶层类,变量赋值后就可以直接拿过来使用。

六、ViewSet

ViewSetMixin

对于前面的类,思路都是分成两个类(BookView用户列表,BookDetailView用于详细)来实现增post、删delete、改put、查get(用于列表)、查get(用于详情),到这里,就不用再写两个自定义的类了。可以合二为一,然后在urls.py里面as_view的参数里,把put、post、delete等method自定义的函数关联起来就可以了。
ViewSetMixin里面的as_view(action)方法可以加参数,用于指定method方法到自定义方法的映射。

path(“book/”, views.BookView.as_view({“get”:”get_all”, “post”:”add_object”})
path(“book/(?P<pk>\d+)”,views.BookView.as_view({“get”:”get_object”, “delete”:”delete_object”, “put”:”update_object”})

GenericViewSet(ViewSetMixin, GenericAPIView)

因为ViewSetMixin类只是提供了一个可以在as_view里定义action字典的这个功能,并没有实现任何逻辑,所以GenericViewSet这个类也没有提供任何逻辑,实际引入了queryset、serializer_calss两个变量。但是这个类再配合系列的ModelMixin类就实现了 create(), retrieve(), update(), partial_update(), destroy() and list() 操作。

class ModelViewSet(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin,GenericViewSet):

注意,这里实现的方法的名称也不是method动作名称,需要在urls.py里面定义字典:

urlpatterns = [path('viewset/user/', views.UserViewSet.as_view({'get': 'list', 'post': 'create'})),path('viewset/user/<int:pk>/', views.UserViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]

七、示例

APIView

urls.py

urlpatterns = [path('user/', views.UserView.as_view()),path('user/<int:pk>/', views.UserDetailView.as_view()),
]

views.py

from rest_framework.views import APIViewclass UserView(APIView):def get(self, request):users = User.objects.all()serializer = UserSerializer(users, many=True)return Response(serializer.data)def post(self, request):serializer = UserSerializer(data=request.data)if serializer.is_valid():serializer.save()return Response(serializer.data, status=201)return Response(serializer.errors, status=400)class UserDetailView(APIView):def get(self, request, pk):user = User.objects.get(pk=pk)serializer = UserSerializer(user)return Response(serializer.data)def put(self, request, pk):user = User.objects.get(pk=pk)serializer = UserSerializer(user, data=request.data)if serializer.is_valid():serializer.save()return Response(serializer.data)return Response(serializer.errors, status=400)def delete(self, request, pk):user = User.objects.get(pk=pk)user.delete()return Response(status=204)

GenericAPIView

需配合一系列的Mixin来使用
urls.py

urlpatterns = [path('mixin/user/', views.UserMixinView.as_view()),path('mixin/user/<int:pk>/', views.UserMixinDetailView.as_view()),
]

views.py

class UserMixinView(mixins.ListModelMixin,mixins.CreateModelMixin,generics.GenericAPIView):queryset = User.objects.all()serializer_class = UserSerializerdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)class UserMixinDetailView(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,generics.GenericAPIView):queryset = User.objects.all()serializer_class = UserSerializerdef get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)def put(self, request, *args, **kwargs):return self.update(request, *args, **kwargs)def delete(self, request, *args, **kwargs):return self.destroy(request, *args, **kwargs)

ListCreateAPIView、RetrieveUpdateDestroyApiView

urls.py

urlpatterns = [path('generic/user/', views.UserGenericView.as_view()),path('generic/user/<int:pk>/', views.UserGenericDetailView.as_view()),
]

views.py

class UserGenericView(generics.ListCreateAPIView):queryset = User.objects.all()serializer_class = UserSerializerclass UserGenericDetailView(generics.RetrieveUpdateDestroyAPIView):queryset = User.objects.all()serializer_class = UserSerializer

ViewSet

urls.py

urlpatterns = [path('viewset/user/', views.UserViewSet.as_view({'get': 'list', 'post': 'create'})),path('viewset/user/<int:pk>/', views.UserViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]

到这里,已经将两个类合二为一了,最简洁,但是也最不灵活,适合用于不添加任何自己逻辑的增删改查查
views.py

class UserViewSet(viewsets.ModelViewSet):queryset = User.objects.all()serializer_class = UserSerializer

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

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

相关文章

ELK(Elasticsearch、Logstash、Kbana)安装及Spring应用

Elasticsearch安装及Spring应用 一、引言二、基本概念1.索引&#xff08;Index&#xff09;2.类型&#xff08;Type&#xff09;3.文档&#xff08;Document&#xff09;4.分片&#xff08;Shard&#xff09;5.副本&#xff08;Replica&#xff09; 二、ELK搭建1.创建挂载的文件…

Redis,从数据结构到集群的知识总结

Redis基础部分 2. 数据结构 redis底层使用C语言实现&#xff0c;这里主要分析底层数据结构 2.1 动态字符串(SDS) 由于C底层的字符串数组一旦遇到’\0’就会认为这个字符串数组已经结束&#xff0c;意味着无法存储二进制数据&#xff08;如图片、音频等&#xff09;&#xff…

【redis】Jedis 操作 Redis 基础指令(下)

列表操作 lpush/rpush 和 lpop/rpop 将一个或者多个元素从左/右侧放入&#xff08;头/尾插&#xff09;到 list 中 依次头插 从 list 左/右侧取出元素&#xff08;即头/尾删&#xff09; public static void test1(Jedis jedis) { jedis.flushAll(); long n jedis.lpush(…

基于消失点标定前视相机外参

1. 消失点 艺术家&工程师在纸上表现立体图时,常用一种透视法,这种方法源于人们的视觉经验:近大远小,且平行的直线都消失于无穷远处同一个点。就像我们观察两条平行的铁轨时会觉得他们相交于远处的一点,我们把这个点称为消失点。 图1 铁轨组成的消失点 2. 在标定中的应…

TypeScript接口 interface 高级用法完全解析

TypeScript接口 interface 高级用法完全解析 mindmaproot(TypeScript接口高级应用)基础强化可选属性只读属性函数类型高级类型索引签名继承与合并泛型约束设计模式策略模式工厂模式适配器模式工程实践声明合并类型守卫装饰器集成一、接口核心机制深度解析 1.1 类型兼容性原理 …

Vue3 Pinia $subscribe localStorage的用法 Store的组合式写法

Vue3 Pinia $subscribe 可以用来监视Stroe数据的变化 localStorage的用法 localStorage中只能存字符串&#xff0c;所有对象要选转成json字符串 定义store时&#xff0c;从localStorage中读取数据talkList可能是字符串也可能是空数组 Store的组合式写法 直接使用reactiv…

新版AndroidStudio / IDEA上传项目到Gitee

目录 1.Gitee创建仓库 2.填写仓库的信息 3.创建成功后复制仓库的地址 4.检查AndroidStudio是否配置Git 5.点击测试 6.之后Create Git Repository 7.添加到本地仓库 8.提交项目 9.添加上传仓库的地址 10.上传成功 11.去Gitee上刷新检查 1.Gitee创建仓库 2.填写仓库的…

用 Vue 3.5 TypeScript 重新开发3年前甘特图的核心组件

回顾 3年前曾经用 Vue 2.0 开发了一个甘特图组件&#xff0c;如今3年过去了&#xff0c;计划使用Vue 3.5 TypeScript 把组件重新开发&#xff0c;有机会的话再开发一个React版本。 关于之前的组件以前文章 Vue 2.0 甘特图组件 下面录屏是是 用 Vue 3.5 TypeScript 开发的目前…

C语言【数据结构】:时间复杂度和空间复杂度.详解

引言 详细介绍什么是时间复杂度和空间复杂度。 前言&#xff1a;为什么要学习时间复杂度和空间复杂度 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时…

Matlab 基于专家pid控制的时滞系统

1、内容简介 Matlab 185-基于专家pid控制的时滞系统 可以交流、咨询、答疑 2、内容说明 略 在处理时滞系统&#xff08;Time Delay Systems&#xff09;时&#xff0c;使用传统的PID控制可能会面临挑战&#xff0c;因为时滞会导致系统的不稳定或性能下降。专家PID控制通过结…

MyBatis源码分析のSql执行流程

文章目录 前言一、准备工作1.1、newExecutor 二、执行Sql2.1、getMappedStatement2.2、query 三、Cache装饰器的执行时机四、补充总结 前言 本篇主要介绍MyBatis解析配置文件完成后&#xff0c;执行sql的相关逻辑&#xff1a; public class Main {public static void main(Str…

【MySQL】数据库基础

目录 一、什么是数据库1.1 为什么要有数据库1.2 数据库的本质是什么1.3 在Linux下看一下数据库 二、主流数据库三、基本使用3.1 连接服务器3.2 服务器&#xff0c;数据库&#xff0c;表关系 四、MySQL架构五、SQL分类六、存储引擎6.1 存储引擎是什么6.2 查看存储引擎6.3 存储引…

算是解决可以访问github但无法clone的问题

本文的前提是使用了**且可以正常访问github 查看代理的端口 将其配置到git 首先查看git配置 git config --list然后添加配置&#xff0c;我这边使用的是Hiddfy默认的端口是12334&#xff0c;如果是clash应该是7890 git config --global http.proxy 127.0.0.1:12334其他 删除…

SpringBoot第三站:配置嵌入式服务器使用外置的Servlet容器

目录 1. 配置嵌入式服务器 1.1 如何定制和修改Servlet容器的相关配置 1.server.port8080 2. server.context-path/tx 3. server.tomcat.uri-encodingUTF-8 1.2 注册Servlet三大组件【Servlet&#xff0c;Filter&#xff0c;Listener】 1. servlet 2. filter 3. 监听器…

AdaLoRA 参数 配置:CAUSAL_LM“ 表示因果语言模型任务

AdaLoRA 参数 配置:CAUSAL_LM" 表示因果语言模型任务 config = AdaLoraConfig( init_r=16, # 增加 LoRA 矩阵的初始秩 lora_alpha=32, target_modules=[“q_proj”, “v_proj”], lora_dropout=0.1, bias=“none”, task_type=“CAUSAL_LM” ) 整体功能概述 AdaLoraCon…

IP 协议

文章目录 IP 协议概述数据包格式首部校验和实例分析实例一 分片抓包分析参考 本文为笔者学习以太网对网上资料归纳整理所做的笔记&#xff0c;文末均附有参考链接&#xff0c;如侵权&#xff0c;请联系删除。 IP 协议 概述 IP 协议是 TCP/IP 协议簇中的核心协议&#xff0c;也…

日常开发记录-radioGroup组件

日常开发记录-radioGroup组件 1.前提2.问题&#xff1a;无限循环调用3.解释Vue 事件传播机制分析与无限循环原因解释4.解决 1.前提 在上一章的&#xff0c;我们实现了radio组件。从这进入了解 新增个radioGroup组件呢。 <template><divclass"q-radio-group&quo…

API调用comfyui工作流,做一个自己的app,chatgpt给我写的前端,一键创建自己的卡通形象,附源码

前言 工具介绍 首先 comfyui你是少不了的&#xff0c;这个是工作流的后端支持&#xff0c;用这个去调试工作流和生成API可调用文件 前端我们就用很流行的gradio吧&#xff0c;什么你一时半会没有学gradio的计划&#xff0c;没事&#xff0c;笔者也没系统学过&#xff0c;我干…

【网络】数据流(Data Workflow)Routes(路由)、Controllers(控制器)、Models(模型) 和 Middleware(中间件)

在图片中&#xff0c;数据流&#xff08;Data Workflow&#xff09;描述了应用程序中数据的流动过程&#xff0c;涉及 Routes&#xff08;路由&#xff09;、Controllers&#xff08;控制器&#xff09;、Models&#xff08;模型&#xff09; 和 Middleware&#xff08;中间件&…

【通义千问】蓝耘智算 | 智启未来:蓝耘MaaS×通义QwQ-32B引领AI开发生产力

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能&#xff08;AI&#xff09;通过算法模拟人类智能&#xff0c;利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络&#xff08;如ChatGPT&…