DRF框架之 serializers 序列化组件
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
models层先创建数据表
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 实例化方法一的实现
自己创建个py文件,写上序列化显示的内容
第二种用法之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)
接口显示单个内容 ,主要PK是关键点
在路由层的配置:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^books/$', views.BooksView.as_view()), #查看全部书的接口
url(r'^books/(?P<pk>\d+)', views.BookView.as_view()), #查看单个书的接口
]
在urls 路由层进行判断
#总结,个人建议使用第二种序列化的方法,这样对反序列化有很好的帮助
以下是全部的接口信息 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)
以下是通过cbv实现的简单的五种请求的接口实现方式
DRF框架之 serializers 序列化组件的更多相关文章
- 【DRF框架】利用序列化组件操作
使用序列化组件进行操作 不带参数:查+增 带参数:查.改.删 不带参数的操作 # url路由 url(r'^book_list/$',Search_book.as_view()), # views.p ...
- Serializers 序列化组件
Serializers 序列化组件 为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转 ...
- Django-Rest-Framework的序列化之serializers 序列化组件
Django-Rest-Framework的序列化之serializers 序列化组件 restful framework 正常的序列化 from django.http import HttpRes ...
- 写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用
写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用 一.了解什么是DRF DRF: Django REST framework Django REST framew ...
- drf3 Serializers 序列化组件
为什么要用序列化组件 做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 给前端数据的时候都要转成json格式,那就需要对从数据库拿到的数据进行序列化. ...
- django rest_framework Serializers 序列化组件
为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿 ...
- 【转】Serializers 序列化组件
https://www.cnblogs.com/MayDayTime/p/9890582.html 为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON ...
- rest-framework框架——APIView和序列化组件
一.快速实例 Quickstart http://www.cnblogs.com/yuanchenqi/articles/8719520.html restful协议 ---- 一切皆是资源,操作只是 ...
- Serializers序列化组件
Django的序列化方法 .values 序列化结果 class BooksView(View): def get(self, request): book_list = Book.objects.v ...
随机推荐
- guava-retrying 源码解析(时间限制策略)
一.时间限制策略相关接口和类 什么是时间限制策略呢?是指在一个时间限制内,包装任何一种重试(尝试)规则,如果超过该限制,那么这个尝试规则可能会被中断,并抛出UncheckedTimeoutExcept ...
- 理解微信小程序的生命周期和运行原理
写微信小程序,他的生命周期不能不知道,不知道小程序就会出现各种bug而无法解决.小助君公众号带你学习小程序的生命周期和运行原理. 小程序由两大线程组成:负责界面的线程(view thread)和服务线 ...
- 互联网创业公司如何防御 DDoS 攻击?采用CDN服务
收集了发表于2015年 攻击者是控制一个足够大的分布式集群来发起攻击,各种杂七杂八的包,什么都会有.根本不在乎你开的什么服务,也没那耐心分析你有什么服务.比如哪怕你根本没开UDP的任何服务,但他就是发 ...
- 当你在web项目下新建一个class时package位置如果发生红色波浪错误,提示为”The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files“
问题是这样的如下图: 问题的原因: 1.配置tomcat7.0的时候自己设置了jre的版本1.8,而没有用myeclipse10自带的jre1.6,导致了出现了差错!
- Python全栈之路----函数进阶----闭包
关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个这样的内部函数在包含它们之外被调用时,就会形成闭 ...
- 基于 Jenkins 构建持续集成任务
1.1 Jenkins 配置使用心得 我是在windows10上安装的,安装过程很简单,从官网上下载下来msi安装包,双击执行就好了.安装程序完成后会自动打开http://localhost:8080 ...
- jdk1.7安装和配置
jdk1.7 安装引用 https://jingyan.baidu.com/article/ff41162596a77912e4823716.html
- etcd和redis的比较和日常使用场景
转自https://blog.csdn.net/weixin_41571449/article/details/79429511 个人观点:etcd的红火来源于kurbernetes用etcd做服务发 ...
- Python脚本模拟僵尸进程与孤儿进程
最近一台机器的systemd内存高达30%多,一直不变,后来排查是僵尸进程,什么是僵尸进程呢,只能google,百度等先了解,然后自己总结了一下,虽然这是基础的东西,但是对于我来说就如新大陆一样.花了 ...
- 邮件报警以及服务端能否ping通客户端的小例子(三)
就这个小小的东西,弄了一天,弄的头晕眼花,毕竟第一次弄这个,记录下来,若干年之后,回看这些笔记,不知是什么样的感想,哈哈.我学一个东西的时候喜欢系统的来,一点一点的来,做这个的时候想法很 ...