序列化

  把Python中对象转换为json格式字符串

反序列化

  把json格式转为为Python对象。

用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串。

序列化两大功能:

  对请求数据进行验证

  对Queryset对象进行序列化

一、Django自带序列化组件

  略

二、rest framework序列化之Serializer

使用方式如下:

建表 models.py

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

views

写一个restframework接口拿到数据(所有图书)

方式一:如果没有序列化组件的话,要先转成字典,然后再用json.dumps()再转。

方式二:用序列化组件。

首先你要序列化谁,先写一个类。这个类继承一个东西,然后用的时候,在视图类中直接用这个类生成一个对象。

from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response # Create your views here. from api import models # 想用这个类,需要导入
from api.MySerializer import BookSerializer class BookView(APIView): def get(self,request,*args,**kwargs):
ret = {
'code':100,
'msg':'成功了'
}
books = models.Book.objects.all()
# 第一个参数是要序列化的对象,如果序列化多条,必须指定many=True
books_ser = BookSerializer(instance=books,many=True)
# 当序列化的对象是单个对象的时候many=False book = models.Book.objects.all().first()
# books_ser.data 就是序列化后的结果 是个字典
print(books_ser.data)
ret['books']=books_ser.data
# return Response(books_ser.data)
return Response(ret)

写的格式化的类在另外的文件夹或文件:

# 自己写一个序列化的类
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
# 序列化哪个字段,必须跟数据库字段一样,都想序列化就一个一个排着写
id = serializers.CharField()
title = serializers.CharField()
price = serializers.CharField()

在线格式化json

https://www.json.cn

获取一本id为3的书  http://127.0.0.1:8000/book/3

路由:

from api import views

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^books/$', views.BookView.as_view()),
url(r'^book/(?P<id>\d+)$', views.Book.as_view()),
]

视图:

from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response # Create your views here. from api import models # 想用这个类,需要导入
from api.MySerializer import BookSerializer class BookView(APIView): def get(self,request,*args,**kwargs):
ret = {
'code':100,
'msg':'成功了'
}
books = models.Book.objects.all()
# 第一个参数是要序列化的对象,如果序列化多条,必须指定many=True
books_ser = BookSerializer(instance=books,many=True)
# 当序列化的对象是单个对象的时候many=False book = models.Book.objects.all().first()
# books_ser.data 就是序列化后的结果 是个字典
print(books_ser.data)
ret['books']=books_ser.data
# return Response(books_ser.data)
return Response(ret) class Book(APIView):
def get(self,requst,id):
ret = {
'code': 100,
'msg': '成功了'
} book = models.Book.objects.filter(pk=id).first()
book_ser = BookSerializer(instance=book,many=False)
ret['book']=book_ser.data
return Response(book_ser.data)

如果序列化加个publish字段  (外键关联的)

拿到的是  "publish": "Publish object"

如果想显示出版社的名字,拿到出版社的id

可以通过source来改名!

  变量名和source指定的值不能一样。

  source还支持继续点(字段)还支持方法

序列化的类:

# 自己写一个序列化的类
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
# 序列化哪个字段,必须跟数据库字段一样,都想序列化就一个一个排着写
id = serializers.CharField() # title = serializers.CharField()
name = serializers.CharField(source='title') price = serializers.CharField() publish_name = serializers.CharField(source='publish.name')
publish_id = serializers.CharField(source='publish.pk')

拿出出版社所有的东西:SerializerMethodField()

意思是支持SerializerMethodField()这个方法,并且把返回值赋值给字段

固定写法:get_这个字段名字,里面有个参数obj,这个obj就是当前对象。

# 自己写一个序列化的类
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
# 序列化哪个字段,必须跟数据库字段一样,都想序列化就一个一个排着写 publish_dic = serializers.SerializerMethodField() def get_publish_dic(self, obj):
#意思是支持SerializerMethodField()这个方法,并且把返回值赋值给publish_dic
return {'id':obj.publish.pk,'name':obj.publish.name,'email':obj.publish.email}

多对多的表关系:  

drf 之序列化组件的更多相关文章

  1. 第三章、drf框架 - 序列化组件 | Serializer

    目录 第三章.drf框架 - 序列化组件 | Serializer 序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer( ...

  2. DRF的序列化组件

    目录 DRF的序列化组件 Serializer组件 序列化 反序列化 ModelSerializer组件 序列化和反序列化 自定义Response方法 基表相关 DRF中ORM的多表关联操作 外键设计 ...

  3. Django框架(十八)—— drf:序列化组件(serializer)

    序列化组件 # 模型层 from django.db import models class Book(models.Model): nid = models.AutoField(primary_ke ...

  4. drf框架 - 序列化组件 | Serializer

    序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 ...

  5. Django框架(十九)—— drf:序列化组件(serializer)

    目录 序列化组件 一.利用for循环来实现序列化(繁琐) 二.利用Django提供的序列化组件(不可控需要的字段) 三.利用drf提供的序列化组件 1.基于Serializer类实现序列化--基本语法 ...

  6. DRF(3) - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件

    一.序列化组件 基于上篇随笔的表结构,通过序列化组件的ModelSerializer设计如下三个接口: GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} PU ...

  7. drf之序列化组件(一):Serializer

    序列化组件:Serializer.ModelSerializer.ListModelSerializer Serializer  偏底层  ModelSerializer       重点  List ...

  8. drf框架 - 序列化组件 | ModelSerializer (查,增,删,改)

    ModelSerializer 序列化准备: 配置 settings.py # 注册rest_framework框架 INSTALLED_APPS = [ ... 'rest_framework' ] ...

  9. DRF(2) - 解析器,序列化组件使用(GET/POST接口设计)

    一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...

随机推荐

  1. -bash: _docker_machine_ps1: 未找到命令

    场景:在安装完docker-machine,设置docker-machine命令自动补齐的时候,出现以下错误: -bash: __docker_machine_ps1: 未找到命令 解决办法:在~/. ...

  2. Rancher2-----了解什么是rancher以及简单部署

    个人理解:就是相当于openstack的图形化界面,或者说应用程序的图形化界面,rancher功能就是在图形化界面去管理容器,包括运行容器,创建网络,存储等:rancher有个应用商店,可以根据自己的 ...

  3. WiFi-ESP8266入门http(1)-建立服务器,直接发送网

    #include <ESP8266WiFi.h> /*** 该工程可以在2.4.0版本esp8266库中运行,没在更高版本库中进行测试 ***/ const char *ssid = &q ...

  4. mysql概述

    MySql大致分为三层结构: 第一层:客户端并非MySql所独有,例如:连接处理.授权认证.安全等功能均在这一层处理 第二层:核心服务包括查询解析.分析.优化.缓存.内置函数(比如 : 时间.数学.加 ...

  5. WPF之TextBox和PasswordBox水印效果

    在博客园里看到了好多关于文本框和密码框水印效果的文章,今天有空也来实现一把,最终效果图如下: 文本框的话,稍微好一点直接可以绑定它的Text属性,因为他是个依赖属性,我用了二种方式来实现水印效果:触发 ...

  6. .netcore 堆栈调用方法小记

    背景 上午临近午饭时,公司同事反馈验证码被攻击灌水.我们匆忙查询验证码明细,对已频繁出现的IP插入黑名单,但IP仍然隔断时间频繁变动,不得已之下只能先封禁对应公司id的验证码发送功能.年初时候,专门对 ...

  7. 【C#复习总结】细说匿名方法

    1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名 ...

  8. 微软Ignite2018——微软宣布新的学习平台:Microsoft Learn

    Ignite 2018 首日感受 头一次参加美国的微软 Ignite 大会,确实规模比国内的大不少.23日是 MVP & RD 的 Pre Day(MVP即Most Valuable Prof ...

  9. JS 异步系列 —— Promise 札记

    Promise 研究 Promise 的动机大体有以下几点: 对其 api 的不熟悉以及对实现机制的好奇; 很多库(比如 fetch)是基于 Promise 封装的,那么要了解这些库的前置条件得先熟悉 ...

  10. itoa函数实现

    1.      整数字符转化为字符串数 // 将整数转换成字符串数,不用函数itoa // 思路:采用加'0',然后在逆序的方法 #include <iostream> using nam ...