关键词:
1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式
2. DRF框架自带序列化的工具: serializers
3. DRF框架 serializers 分为:第一种 Serializer 第二种 ModelSerializer
第一种用法之 Serializer
from django.db import models # Create your models here. class Book(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) publish_date = models.DateField() publish = models.ForeignKey(to=‘Publish‘,to_field=‘nid‘,on_delete=models.CASCADE) authors=models.ManyToManyField(to=‘Author‘) def __str__(self): return self.name def test(self): #注意: 这里是给后面序列化组件的source指定方法用的 return str(self.price)+self.name class Author(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField() author_detail = models.OneToOneField(to=‘AuthorDatail‘,to_field=‘nid‘,unique=True,on_delete=models.CASCADE) class AuthorDatail(models.Model): nid = models.AutoField(primary_key=True) telephone = models.BigIntegerField() birthday = models.DateField() addr = models.CharField(max_length=64) class Publish(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) city = models.CharField(max_length=32) email = models.EmailField() def __str__(self): return self.name
from rest_framework import serializers from app.models import Book,Author ####################这里是serializers 实例化方法一的实现 # class Bookserializer(serializers.Serializer): # 这里是通过rest_framwork 来实例化对象中的内容,返回给前端的数据信息 id = serializers.CharField() # source指定数据库中的名字,前面可以自定义名字来使用,给前端显示的是自定义名字 bookname 是自己自定义的名字 bookname = serializers.CharField(source=‘name‘) price = serializers.CharField() # source还可以通过对象继续点其他属性, 可以跨表点其他的想要的属性(这个只是拿到publish的单个字段) publish_name = serializers.CharField(source=‘publish.name‘) #注意source 还可以调用models中 Book 表内的方法 maxprice = serializers.CharField(source=‘test‘) #注意,source 可以名字自定义显示,可以跨表链接其他想要的属性,还可以调用book表中的自定义的方法 # publish字段,返回出版社的所有信息,包括id,name,email。。。。 # #SerializerMethodField配合一个方法,方法的返回值会付给publish #SerializerMethodField 可以拿到跨表内的多个字段,你吧想要的都返还回去就行了(这里是拿到publish的多个字段信息) publish = serializers.SerializerMethodField() #这里这里的obj 是当前序列化的对象 这里的对象就是book!!!! def get_publish(self,obj): return ‘id‘:obj.publish.pk, ‘name‘: obj.publish.name,‘city‘:obj.publish.city ####################这里是serializers 实例化方法一的实现
第二种用法之ModelSerializer
###################这里是serializers实例化实现方法二 的实现,调用ModelSerializer class Bookserializer(serializers.ModelSerializer): #这里一个meta类去调用Book这个表 class Meta: model = models.Book #fields 是然他显示所有的内容,渲染出去 fields = "__all__" # ‘__all__‘ 是渲染全部出去 # #fields = [‘id‘, ‘name‘] # [‘....‘] 是渲染指定的 # # exclude=[‘name‘] #是除了name 之外的全部都渲染出去,不能和fields同时出现 # #depth = 3 #深度 ,官方建议最多写10,深度显示所有的表 # #这里是可以自定义,自定义显示publish的名字, publish_name = serializers.CharField(source=‘publish.name‘) publish = serializers.SerializerMethodField() #也可以拿到publish的多个字段信息 def get_publish(self,obj): return ‘id‘:obj.publish.pk, ‘name‘:obj.publish.name ###################这里是serializers实例化实现方法二 的实现,调用ModelSerializer 最后建议使用serializers.ModelSerializer 来实现序列化 ,因为在修改接口和添加接口 对save() 有很好的依赖关系
# 局部钩子函数,对单个字段校验 #校验name字段不能以sb开头 def validate_name(self,value): if value.startswith(‘sb‘): #不能让你过 raise ValidationError(‘书名不能以sb开头‘) else: return value #全局钩子函数,对全局字段进行校验 # def validate(self,a): # # print(a) # name=a.get(‘name‘) # price=a.get(‘price‘) # if name != price: # raise ValidationError(‘错了‘) # else: # return a
最后视图函数调用序列化的内容并返回给前端进行渲染处理
在View视图层操作: 查询多本书的方法: from rest_framework.views import APIView from rest_framework.response import Response from app.models import Book from app.Myserialize import Bookserializer class Books(APIView): # 这个是获取多本书的接口 def get(self, request, *args, **kwargs): # 这里是通过对drf框架 使用cbv 的get请求 response = ‘status‘: 100, ‘msg‘: ‘获取成功‘ # 设置发送出去response 信息 book_list = Book.objects.all() book_ser = Bookserializer(book_list, many=True) # 使用drf 实例化 自定义的Bookserializer 来实例化 response[‘data‘] = book_ser.data # 把实例化book_ser 的data数据放入 response[‘data‘]中 return Response(response) # 在使用Response来返回出去 def post(self, request): #这个是添加书的接口 response = ‘status‘: 100, ‘msg‘: ‘添加成功‘ try: book_ser = Bookserializer(data=request.data) if book_ser.is_valid(): #这里就是晕倒的反序列的内部工具和钩子判断 book_ser.save() response[‘data‘] = book_ser.data #判断通过吧数据返回出去 else: response[‘msg‘] = book_ser.errors except Exception as e: response[‘msg‘] = str(e) return Response(response)
class BookView(APIView): #获取单本图书的接口 def get(self, request, pk,*args, **kwargs): response = ‘status‘: 100, ‘msg‘: ‘获取成功‘ #取到pk为传入的pk的书,book对象 book = models.Book.objects.all().filter(pk=pk).first() #要序列化单条,many=False book_ser=BookSerializer(instance=book,many=False) # book_ser=BookSerializer(book,many=False) response[‘data‘]=book_ser.data return Response(response) def put(self,request,pk): #修改某本书 response = ‘status‘: 100, ‘msg‘: ‘修改‘ book=models.Book.objects.filter(pk=pk).first() #修改 book_ser = BookSerializer(instance=book,data=request.data) if book_ser.is_valid(): book_ser.save() response[‘data‘]=book_ser.data else: response[‘msg‘]=book_ser.errors return Response(response)
在路由层的配置: urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^books/$‘, views.BooksView.as_view()), #查看全部书的接口 url(r‘^books/(?P<pk>\d+)‘, views.BookView.as_view()), #查看单个书的接口 ]
#总结,个人建议使用第二种序列化的方法,这样对反序列化有很好的帮助
以下是全部的接口信息 from app import models from app.Myserializers import BookSerializers # Create your views here. from rest_framework.views import APIView from rest_framework.response import Response class Booksview(APIView): def get(self,request,*args,**kwargs): #获取多本书 response = ‘status‘:100, ‘msg‘:‘查询成功‘ book_list = models.Book.objects.all() book_ser = BookSerializers(book_list,many=True) response[‘data‘] = book_ser.data return Response(response) def post(self,request): #添加书 response = ‘status‘:100, ‘msg‘:‘添加成功‘ try: book_ser = BookSerializers(data=request.data) #序列化工具拿到的数据是在request.data内的字典中获取 if book_ser.is_valid(): #进行钩子判断与基础验证 book_ser.save() response[‘data‘] =book_ser.data else: response[‘msg‘]= book_ser.errors except Exception as e: response[‘msg‘] =str(e) return Response(response) class Bookview(APIView): def get(self, request, pk, *args, **kwargs): #获取单本书的接口 response = ‘status‘:100 , ‘msg‘: ‘获取成功‘ book = models.Book.objects.all().filter(pk=pk).first() book_ser = BookSerializers(instance=book,many=False) response[‘data‘] = book_ser.data return Response(response) def put(self, request,pk): #修改但本书的接口 response = ‘status‘:100, ‘msg‘:‘修改成功‘ book = models.Book.objects.filter(pk=pk).first() book_ser = BookSerializers(instance=book,data=request.data) if book_ser.is_valid(): book_ser.save() response[‘data‘]= book_ser.data else: response[‘msg‘]= book_ser.errors return Response(response) def delete(self,request,pk): #删除的接口 response = ‘status‘:100, ‘msg‘: ‘删除成功‘ book = models.Book.objects.filter(pk=pk).delete() return Response(response)
drf框架serializer之modelserializer(代码片段)
一、基本语法在没有使用ModelSerializer序列化器类之前,我们定义的序列化器类都需要添加对应模型类字段的很多字段,如果添加的字段特别多,那么势必会影响开发效率和代码的可读性,因此会选择一种更为简洁的序列化器类来... 查看详情
drf框架之serializer序列化器的序列化操作(代码片段)
在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer.今天,我们就先来学习一下Serializer序列化器。使用Serializer序列化器的开发步骤:1.定义Serializer序列化器首先,我们要在子应用中,创建见一个serializers.py文件... 查看详情
drf之序列化组件(代码片段)
1一序列化器-Serializer作用:1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型3.反序列化,完成数据校验功能1.1定... 查看详情
drf框架之modelserializer序列化器(代码片段)
ModelSerializer是Serializer的子类,序列化和反序列化跟Serializer一样。ModelSerializer与常规的Serializer相同,但提供了:基于模型类自动生成一系列字段基于模型类自动为Serializer生成validators,比如unique_together包含默认的create()和update()的... 查看详情
drf序列化组件(代码片段)
rest_framework序列化之Serializer步骤:1.自定义一个类,继承Serializer类;2.在类中写要序列化的字段;3.使用:在views.py文件中,book_ser=BookSerializer(book_list,many=True),book_ser.data就是序列化后的数据。当序列化的数据有多条(为QuerySet对... 查看详情
django框架(十九)——序列化组件(serializer)(代码片段)
目录序列化组件一、利用for循环来实现序列化(繁琐)二、利用Django提供的序列化组件(不可控需要的字段)三、利用drf提供的序列化组件1、基于Serializer类实现序列化——基本语法2、基于Serializer类实现序列化——高级语法3、... 查看详情
drf序列化(代码片段)
1.rest-framework序列化之Serializerrest-framework序列化之Serializer步骤1.创建一个类,继承Serializer2.在类中写要序列化的字段‘‘‘classBookSerializer(serializers.Serializer):#序列化表中的某几个字段固定写法nid=serializers.CharField()name=serializers. 查看详情
drf序列化组件(代码片段)
目录1一序列化器-Serializer1.1定义序列化器1.2创建Serializer对象1.3序列化器的使用1.3.1序列化1.3.1.1基本使用1.3.1.2高级用法source和serializers.SerializerMethodField()的用法1.3.2反序列化1.3.2.1数据验证1)validate_字段名2)validate3)validators1.3.2.2反序... 查看详情
drf序列化(代码片段)
一、安装Django RESTframework框架使用命令:pipinstalldjangorestframework二、在setings里面注册INSTALLED_APPS=["rest_framework"]Serializers序列化组件 查看详情
django-rest-framework---总结(代码片段)
...果渲染数据的方式不一样3.解析模块4.异常模块5.响应模块序列化组件:1.Serializer2.序列化与反序列化整合(重点)3.整体单改4.单与整体局部修改视图类视图类传递参数给序列化类二次封装Response类视图家族GenericAPIView基类mixins视... 查看详情
drf框架——drf-jwt手动签发与校验过滤组件筛选组件排序组件分页组件(代码片段)
...k_jwt.serializer.JSONWebTokenSerializer处理完成数据的校验,会走序列化类的全局钩子校验规则,校验得到登录用户并签发token存储在序列化对象中核心源码:rest_framework_jwt.serializer.JSONWebTokenSerializer的validate(self,attrs)方法defvalidate(self,attrs... 查看详情
restframework(drf)框架初探以及认识serializers序列化器的增删改查(代码片段)
定义DjangoRESTframework(简称DRF)是一个强大灵活的wbapi工具功能完善,可快速开发api平台官网地址https://www.django-rest-framework.org/安装要求pip3installdjango==3.2pip3installdjangorestframework1.0使用drf实现用户的增删改查1.创建app2.定义数 查看详情
drf序列化组件(代码片段)
目录在视图中手动完成序列化操作Serializer序列化Serializer序列化总结:Serializer反序列化Serializer反序列化总结:ModelSerializer序列化与反序列化ModelSerializer序列化与反序列化总结:在视图中手动完成序列化操作#view.pyclassUserV1ApiView(AP... 查看详情
drf之解析器组件及序列化组件(代码片段)
通过上一篇博客的学习,我们已经有了一个共识,Django无法处理application/json协议请求的数据,即,如果用户通过application/json协议发送请求数据到达Django服务器,我们通过request.POST获取到的是一个空对象。 DjangoRestFramework... 查看详情
drf框架(代码片段)
...析模块、渲染模块、响应模块、异常模块四、drf核心组件序列化组件:将后台的任何数据,进行序列化返回给前台;将前台的数据反序列化成后台model对象再入库三大认证组件:认证组件、权限组件(RBAC)、频率组件视图家族:View... 查看详情
drf序列化组件(代码片段)
1序列化组件介绍1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型3.反序列化,完成数据校验功能2简单使用1写一... 查看详情
drf框架之视图的扩展类简介(代码片段)
...义API‘‘‘#1.设置查询集queryset=BookInfo.objects.all()#2.设置序列化器serializer_class=BookInfoModelSerializer#请求方法1.ListModelMixin扩展类ListModelMixin扩展类,为我们提供了一个list方法,实现了查询所有信息的功能,并返回JSON数据。源代码:c... 查看详情
modelserializer组件(代码片段)
ModelSerializer组件一、DRF模型类序列化器如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。ModelSerializer与常规的Serializer相同,但提供了:基于模型... 查看详情