序列化组建
时间:2018-12-11
本文章向大家介绍序列化组建,主要包括序列化组建相关应用实例、知识点总结和注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、什么是序列化组件?
本质上为了实现前后端分离,而进行json序列化的一个组件形式,极大方便了解析数据的作用
所有序列化是基于APIView解析器实现的,通过内部的多继承关系方便实现进行数据序列化的实现
二、使用方法
1、基于APIView 引入 from rest_framework.views import APIView 2、返回的请求用 Response: from rest_framework.response import Response 3、开始进行创建序列化类的方式:from rest_framework import serializers
第一步:创建序列化类
创建出返回页面显示的字段,一对多关系同创建普通字段一样,无需特意声明关系,但需要引入:
source=publish.city 重命名:用source :xx = serializers.CharField(source='name');将name命名为xx
第二步:创建需要解析的数据类,继承APIView方法
创建 的方法要遵循rest请求规范
1、获取需要传递的数据
2、将数据 传到序列化类中,返回一个实例化对象
3、通过返回return Response(实例化对象.data)返回给页面
视图层(views.py)
from django.shortcuts import render # Create your views here. from app01 import models from rest_framework.views import APIView from app01.mySer import BookSerializer from django.http import JsonResponse class Books(APIView): def get(self, request, *args, **kwargs): ret = models.Book.objects.all() # 生成一个序列化的对象,传参数 # 序列化多条,记住 many=True book_ser = BookSerializer(ret, many=True) print(book_ser.data) return JsonResponse(book_ser.data, safe=False)
新建的py文件
from rest_framework import serializersclass BookSerializer(serializers.Serializer): name = serializers.CharField() # 可以用source修改别名 # xxx = serializers.CharField(source='name') price = serializers.CharField() # 可以用source拿出出版社内的各个字段 # publish=serializers.CharField(source='publish.name') # publish = serializers.CharField(source='publish.city') # 指定函数,test在models中 test = serializers.CharField(source='publish.test') publish_id = serializers.CharField() # 拿出出版社的所有信息 # SerializerMethodField可以指定一个方法 publish = serializers.SerializerMethodField() # 方法名:叫get_ 字段名,要传参数,参数是:当前book对象 def get_publish(self, obj): # obj是当前book对象 dic = {'name': obj.publish.name, 'email': obj.publish.email} return dic
模板层(models)
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 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 def test(self): return self.email
拿出这本书的所有作者(在新建的py文件 中)
# 写作者序列化的类 class AuthorSerializer(serializers.Serializer): nid = serializers.CharField() name = serializers.CharField() age = serializers.CharField() class BookSerializer(serializers.Serializer): authors = serializers.SerializerMethodField() #方法一 def get_authors(self, book): # 拿出这本书的所有作者 aus = book.authors.all() # 拼出一个列表,列表中套字典 ,每个字典是一个作者 l1 = [] for i in aus: l1.append({'name': i.name, 'age': i.age}) return l1 # 方法二 def get_authors(self,book): aus=book.authors.all() # 可以继续用序列化类,来处理 auth_ser=AuthorSerializer(aus,many=True) return auth_ser.data
# class BookSerializer(serializers.ModelSerializer): # # 必须写一个内部类,名字叫 Meta # class Meta: # # 查询Book该表中的所有字段 # model = Book # fields = '__all__' # # 重写属性 # publish = serializers.CharField(source='publish.name') # authors = serializers.SerializerMethodField() # # def get_authors(self, book): # aus = book.authors.all() # # 可以继续用序列化类,来处理 # auth_ser = AuthorSerializer(aus, many=True) # return auth_ser.data class BookSerializer(serializers.ModelSerializer): # 必须写一个内部类,名字叫 Meta class Meta: # 查询Book该表中的所有字段 model = Book # fields = '__all__' # 指定取出的字段 fields = ['nid', 'authors'] # 去掉指定的字段 exclude = ['publish', 'name'] # 重写属性 # 指定深度(官方建议小于10,个人建议小于3) # depth=1
本质上为了实现前后端分离,而进行json序列化的一个组件形式,极大方便了解析数据的作用
所有序列化是基于APIView解析器实现的,通过内部的多继承关系方便实现进行数据序列化的实现
二、使用方法
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试
- 关于order by中的数据排序(r4笔记第6天)
- 深度学习CTPN+CRNN模型实现图片内文字的定位与识别(OCR)
- Markdown语法讲解及MWeb使用教程
- 通过Linu命令实现屏幕录制和回放(r4笔记第5天)
- 用keras对国产剧评论文本的情感进行预测
- python常用可视化技巧
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(六)maven整合SSM
- 通过java程序抽取日志中的sql语句(r4笔记第4天)
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(七)JDBC url的连接参数
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(十)SVN搭建
- position:sticky的兼容性尝试
- Python爬虫股票评论,snowNLP简单分析股民用户情绪
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php+jQuery ajax实现的实时刷新显示数据功能示例
- yii2.0框架使用 beforeAction 防非法登陆的方法分析
- PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
- php项目中类的自动加载实例讲解
- Yii框架参数配置文件params用法实例分析
- 使用Kotlin实现文字渐变TextView的代码
- thinkPHP5框架路由常用知识点汇总
- PHP实现一个限制实例化次数的类示例
- AndroidStudio中重载方法@Override的使用详解
- mysqli扩展无法在PHP7下升级问题的解决
- PHP通过文件保存和更新信息的方法分析
- PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
- PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
- android之json数据过长打印不全问题的解决
- PHP实现时间日期友好显示实现代码