Rest Framework:序列化组件
Django内置的serializers(把对象序列化成json字符串
from django.core import serializers def test(request):
book_list = Book.objects.all()
ret = serializers.serialize("json", book_list)
return HttpResponse(ret)
二 rest-framework序列化之Serializer
models部分
from django.db import models # Create your models here. class Book(models.Model):
title=models.CharField(max_length=32)
price=models.IntegerField()
pub_date=models.DateField()
publish=models.ForeignKey("Publish")
authors=models.ManyToManyField("Author")
def __str__(self):
return self.title class Publish(models.Model):
name=models.CharField(max_length=32)
email=models.EmailField()
def __str__(self):
return self.name class Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
def __str__(self):
return self.name
view部分
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from django.shortcuts import HttpResponse
from django.core import serializers from rest_framework import serializers class BookSerializers(serializers.Serializer):
title=serializers.CharField(max_length=32)
#title3=serializers.CharField(source='title')
# 指定source='title' ,表示序列化模型表中的title字段,重名命为title3(title和source='title'指定的name不能重名)
price=serializers.IntegerField()
pub_date=serializers.DateField()
publish=serializers.CharField(source="publish.name")
# source不但可以指定一个字段,还可以指定一个方法,如果是方法,会执行方法,不用加括号
#authors=serializers.CharField(source="authors.all")
# 序列化出版社的详情,指定SerializerMethodField之后,可以对应一个方法,返回什么内容,publish_detail就是什么内容
authors=serializers.SerializerMethodField(read_only=True)
# write_only 序列化的时候,该字段不显示
# #read_only 反序列化的时候,该字段不传
# #对应的方法固定写法get_字段名
def get_authors(self,obj):
temp=[]
for author in obj.authors.all():
temp.append(author.name)
return temp
#此处可以继续用author的Serializers,
# def get_authors(self,obj):
#方法一:
# return [ {'name':author.name,'age':author.age} for author in obj.authors.all()]
#方法二:
# ret=obj.authors.all()
# ss=AuthorSerializer(ret,many=True)
# return ss.data
#需要重写Crete方法
def create(self,validated_data):
res = models.Book.objects.create(**validated_data)
return authorser.data
class BookViewSet(APIView): def get(self,request,*args,**kwargs):
book_list=Book.objects.all()
# 序列化方式1:
# from django.forms.models import model_to_dict
# import json
# data=[]
# for obj in book_list:
# data.append(model_to_dict(obj))
# print(data)
# return HttpResponse("ok") # 序列化方式2:
# data=serializers.serialize("json",book_list)
# return HttpResponse(data) # 序列化方式3:
bs=BookSerializers(initial=book_list,many=True) #many=True代表有多条数据,如果只有一条数据(可以不写),many=False.(可以不写).instance是要序列化的对象
return Response(bs.data)
# 序列化方式4:
# ret=models.Book.objects.all().values('nid','title')
# dd=list(ret)
# return HttpResponse(json.dumps(dd))
# 使用继承了Serializers序列化类的对象,反序列化
def post(self,request):
# #实例化产生一个序列化类的对象,data是要反序列化的字典
# # print(request.data)
bookser=BookSerializers(data=request.data)
if bookser.is_valid():
# #清洗通过的数据
ret=bookser.create(bookser.validated_data)
#
return Response()
如在模型中定义一个方法,直接可以在在source指定执行:
class UserInfo(models.Model):
user_type_choices = (
(1,'普通用户'),
(2,'VIP'),
(3,'SVIP'),
)
user_type = models.IntegerField(choices=user_type_choices) username = models.CharField(max_length=32,unique=True)
password = models.CharField(max_length=64) #视图
ret=models.UserInfo.objects.filter(pk=1).first()
aa=ret.get_user_type_display() #serializer
xx=serializers.CharField(source='get_user_type_display')
rest-framework序列化之ModelSerializer
from rest_framework import serializers
from rest_framework.response import Response
from app01 import models
class AuthorSerializer(serializers.Serializer):
name=serializers.CharField()
age=serializers.CharField()
class BookSerializers(serializers.ModelSerializer):
class Meta:
model = models.Book
#展示全部
# fields = "__all__"
#可以允许展示的
fields=['nid','title','authors','publish']
#不允许展示的
# exclude=('nid',) #不能跟fields同时用
# depth = 1 #深度控制,写 几 往里拿几层,层数越多,响应越慢,官方建议0--10之间,个人建议最多3层
# xx=serializers.CharField(source='get_xx_display')
publish=serializers.SerializerMethodField()
def get_publish(self,obj):
return obj.publish.name
#这种方法到了后期可以在家字段
authors=serializers.SerializerMethodField()
def get_authors(self,obj):
ret=obj.authors.all()
ss=AuthorSerializer(initial=ret,many=True)
return ss.data
# 使用继承了ModelSerializers序列化类的对象,反序列化
def post(self, request):
# 实例化产生一个序列化类的对象,data是要反序列化的字典
bookser = BookSerializers(data=request.data)
# bookser.data
if bookser.is_valid(raise_exception=True):
# 清洗通过的数据
bookser.save()
else:
print(bookser.errors['name'][0])
return Response()
五 序列化组件之请求数据校验和保存功能
class BookSerializer1(serializers.Serializer):
title=serializers.CharField(error_messages={'required': '标题不能为空'}) #这种方式要保存,必须重写create方法
通过源码查看留的校验字段的钩子函数:
#反序列化的校验(局部校验,全局校验)
#使用钩子一般都是字段写出来,而不是用__all__方法
def validate_name(self,value): print(value)
raise exceptions.ValidationError('不能以sb开头')
# if value.startswith('sb'):
# raise ValidationError('不能以sb开头')
# return value def validate(self,attrs):
print(attrs)
# if attrs.get('price')!=attrs.get('xx'):
# raise exceptions.ValidationError('name和price相等,不正常')
return attrs
view视图
def post(self,request):
#实例化产生一个序列化类的对象,data是要反序列化的字典
bookser=BookSerializer(data=request.data)
# bookser.data
#raise_seception=True错误会显示到前端
if bookser.is_valid(raise_exception=True):
#清洗通过的数据
bookser.save()
else:
print(bookser.errors['name'][0])
return Response()
序列化组件源码分析
序列化组件,先调用__new__方法,如果many=True,生成ListSerializer对象,如果为False,生成Serializer对象
序列化对象.data方法--调用父类data方法---调用对象自己的to_representation(自定义的序列化类无此方法,去父类找)
Aerializer类里有to_representation方法,for循环执行attribute = field.get_attribute(instance)
再去Field类里去找get_attribute方法,self.source_attrs就是被切分的source,然后执行get_attribute方法,source_attrs
当参数传过去,判断是方法就加括号执行,是属性就把值取出来
图书的增删查改resful接口:
视图层:
class BookSerializers(serializers.ModelSerializer):
class Meta:
model=models.Book
fields='__all__' class BookView(APIView): def get(self, request):
book_list = models.Book.objects.all()
bs = BookSerializers(book_list, many=True)
# 序列化数据 return Response(bs.data) def post(self, request):
# 添加一条数据
print(request.data) bs=BookSerializers(data=request.data)
if bs.is_valid():
bs.save() # 生成记录
return Response(bs.data)
else: return Response(bs.errors) class BookDetailView(APIView):
def get(self,request,pk):
book_obj=models.Book.objects.filter(pk=pk).first()
bs=BookSerializers(book_obj,many=False)
return Response(bs.data)
def put(self,request,pk):
book_obj = models.Book.objects.filter(pk=pk).first() bs=BookSerializers(data=request.data,instance=book_obj)
if bs.is_valid():
bs.save() # update
return Response(bs.data)
else:
return Response(bs.errors)
def delete(self,request,pk):
models.Book.objects.filter(pk=pk).delete() return Response("")
路由:
url(r'^books/$', views.BookView.as_view()),
url(r'^books/(?P<pk>\d+)$', views.BookDetailView.as_view()),
Rest Framework:序列化组件的更多相关文章
- [Django REST framework - 序列化组件、source、钩子函数]
		[Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ... 
- django rest framework 序列化组件总结
		序列化组件总结 一. 序列化组件本质上为了实现前后端分离,而进行json序列化的一个组件形式,极大方便了解析数据的作用 二. 所有序列化是基于APIView 解析器实现的,通过内部的多继承关系方便实现 ... 
- Restful framework【第三篇】序列化组件
		基本使用 -序列化 -对象,转成json格式 用drf的序列化组件 -定义一个类继承class BookSerializer(serializers.Serializer): -写字段,如果不指定so ... 
- restful framework之序列化组件
		一.Django自带序列化组件 from django.core import serializers def test(request): book_list = Book.objects.all( ... 
- 基于Django的Rest Framework框架的序列化组件
		本文目录 一 Django自带序列化组件 二 rest-framework序列化之Serializer 三 rest-framework序列化之ModelSerializer 四 生成hypermed ... 
- cvb源码分析,resful规范,drf,drf序列化组件,95
		1 CBV的源码分析 -Class Base View(基于类的视图) -Function Base View(基于函数的视图) -def as_view 类方法 -def view:类方法内部,闭包 ... 
- drf 之序列化组件
		序列化 把Python中对象转换为json格式字符串 反序列化 把json格式转为为Python对象. 用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串. 序列化两大功能 ... 
- rest-framework框架——APIView和序列化组件
		一.快速实例 Quickstart http://www.cnblogs.com/yuanchenqi/articles/8719520.html restful协议 ---- 一切皆是资源,操作只是 ... 
- Django-Rest-Framework的序列化之serializers 序列化组件
		Django-Rest-Framework的序列化之serializers 序列化组件 restful framework 正常的序列化 from django.http import HttpRes ... 
随机推荐
- 一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试
			一:背景 1. 讲故事 每次项目预交付的时候,总会遇到各种奇葩的坑,我觉得有必要梳理一下以及如何快速解决的,让后来人避避坑,这篇就聊聊自己的所闻所遇: 我去,本地环境代码跑的哧溜,上了测试环境出问题 ... 
- 从ReentrantLock加锁解锁角度分析AQS
			本文用于记录在学习AQS时,以ReentrantLock为切入点,深入源码分析ReentrantLock的加锁和解锁过程. 同步器AQS的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理 ... 
- Spring Cloud Alibaba 之Nacos
			Nacos 技术讲解 一提到分布式系统就不的不提一下 CAP 原则 什么是CAP CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency).可用性(Availability ... 
- leetcode115:search -insert-position
			题目描述 给出一个有序的数组和一个目标值,如果数组中存在该目标值,则返回该目标值的下标.如果数组中不存在该目标值,则返回如果将该目标值插入这个数组应该插入的位置的下标 假设数组中没有重复项. 下面给出 ... 
- 解决IE下readonly的Input光标选中的问题
			首先用unselectable="on"解决,但是这种方法bug太多, 屏蔽了input的onblur事件(也就是focus事件在Angualr下),所以只能用click事件来代替 ... 
- C# 简易的串口监视上位机实现
			实现上位机和下位机之间的通信,通常使用的是串口通信,接下来实现一个通过上位机和串口调试助手来完成串口通信测试. 首先创建一个WInfrom窗体应用工程文件,创建过程可参考https://www.cnb ... 
- Avoided redundant navigation to current location: "/users"
			问题产生的原因:在Vue导航菜单中,重复点击一个菜单,即重复触发一个相同的路由,会报错,但不影响功能 解决:在router的配置文件中加入如下代码: const originalPush = Rout ... 
- Docker学习第二天(Docker容器管理)
			简介 emmmm Docker 容器管理 推荐文章:容器技术概述 run里面的子选项 1.使用run命令创建容器 docker container run -it ubuntu /bin/bash / ... 
- 两年经验拿到蚂蚁金服,字节offer,附上金九银十BAT面试核心知识点整理
			前言 我自己是本科毕业后在老东家干了两年多,老东家算是一家"小公司"(毕竟这年头没有 BAT 或 TMD 的 title 都不好意思报出身),毕业这两年多我也没有在大厂待过,因此找 ... 
- zabbix的搭建及操作(2)监控windows10及网络设备
			实验环境 配置完成的Server端 Web --详情点击 windows10 192.168.10.1 (与虚拟机同一Vmnet的IP地址)必须关闭防火墙 网络设备GNS 192.168.10.50 ... 
