序列化组建
2018-12-12 09:27:32来源:博客园 阅读 ()
一、什么是序列化组件?
本质上为了实现前后端分离,而进行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解析器实现的,通过内部的多继承关系方便实现进行数据序列化的实现
二、使用方法
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- python day1-requests 2019-08-13
- python变量和常量 2019-08-13
- Python-17-反射 2019-07-24
- Python-15-面向对象 2019-07-24
- 第三章 hash是个啥玩意 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash