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 ...
随机推荐
- Js中常见的内存泄漏场景
常见的内存泄漏场景 内存泄漏Memory Leak是指程序中已动态分配的堆内存由于疏忽或错误等原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果.内存泄漏并非指内 ...
- ubuntu 17.10 安装QQ
折腾一大堆 看报错信息 正在选中未选择的软件包 wine-qqintl:i386.(正在读取数据库 ... 系统当前共安装有 185429 个文件和目录.)正准备解包 wine-qqintl_0.1. ...
- C#练习题 if
提示用户输入用户名,然后再提示输入密码,如果用户名是"admin"并且密码是"888888",则提示正确,否则,如果用户名不是admin还提示用户用户名不存在, ...
- C++编程基础练习,入门必备练手
练习1,1 从一个简单程序开始 1,将string头文件注释掉,重新编译这个程序,会发生什么事? 目前还没有发现会发生什么事. 2,将using namespace std注释掉,重新编译,会发生什么 ...
- 面试都要问的Spring MVC
MVC总结 1. 概述 还是之前的三个套路 1.1 是什么? Spring提供一套视图层的处理框架,他基于Servlet实现,可以通过XML或者注解进行我们需要的配置. 他提供了拦截器,文件上传,CO ...
- Netlink 内核实现分析 4
netlink 库函数: http://www.infradead.org/~tgr/libnl/doc/core.html#core_netlink_fundamentals #define NET ...
- windows10 vs2017编译opencv_contrib3.4.7的小坑及编译好的资源
1.注意要用正斜杠 / 不要用 \ https://github.com/opencv/opencv/issues/11655 CMake Error at cmake/OpenCVModu ...
- 适用初学者的5种Python数据输入技术
摘要:数据是数据科学家的基础,因此了解许多加载数据进行分析的方法至关重要.在这里,我们将介绍五种Python数据输入技术,并提供代码示例供您参考. 数据是数据科学家的基础,因此了解许多加载数据进行分析 ...
- 用rsync备份一台linux服务器上的数据
rsync是安装完linux后都会自带的,在机器上运行rsync命令看是否有安装即可 备份到远程服务器 这里介绍的rsync的用途是备份一台linux服务器上的数据到另外一台机器 环境 将需要备份机器 ...
- CSS z-index应用靠近用户的框
1.z-index (1)z轴.数值越大,越靠近你 (2)只能作用于定位过的标签元素 应用示例 <!DOCTYPE html> <html lang="zh-CN" ...