一:django自带序列化组件

Django内置的serializers(把对象序列化成json字符串)
from django.core import serializers
def test(request):
book_list = models.Book.objects.all()
ret = serializers.serialize('json', book_list)
return HttpResponse(ret)

二: rest-framework序列化之Serializer

Serializer各种方法即单表查询

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

models.py

在app01中创建一个新的py文件,mySer.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from rest_framework import serializers class BookSerializer(serializers.Serializer):
# 重命名
thisname = serializers.CharField(source='name')
price = serializers.CharField()
# 在source不光能指定字段的名字,还能指定函数的名字
test = serializers.CharField(source='publish.test') # 在source后这样写,能拿到表中的任意字段
# publish = serializers.CharField(source='publish.city')
# source加.内容,判断点后面的是一个字段还是一个可执行的函数,
# 是函数就加括号执行,是字段,取出对应的值给publish # SerializerMethodField可以制定一个方法
publish = serializers.SerializerMethodField()
#方法名:叫get_字段名,要传参数,参数是:当前book对象
def get_publish(self, obj):
dic = {'name': obj.publish.name,'email':obj.publish.email}
return dic

mySer.py

详解如下

来到视图对象

from django.shortcuts import render, HttpResponse
from rest_framework.views import APIView
from app01 import models
from app01.mySer import BookSerializer
from django.http import JsonResponse # Create your views here. # Django内置的serializers(把对象序列化成json字符串)
# from django.core import serializers
# def test(request):
# book_list = models.Book.objects.all()
# ret = serializers.serialize('json', book_list)
# return HttpResponse(ret) class Books(APIView):
def get(self, request, *args, **kwargs):
ret = models.Book.objects.all() # queryset对象
# 生成一个序列化对象,传参数
# 序列化多条,记住many=True
book_ser = BookSerializer(ret, many=True) return JsonResponse(book_ser.data, safe=False)

views.py

总结以上内容

-1 重命名:用source:xx = serializers.CharField(source='name')
-2 取出出版社名字:
方式一:
-在模型表中重写__str__方法
-publish=serializers.CharField()
方式二:
-用source
-拿出出版社的城市
-publish=serializers.CharField(source='publish.city') *****如果不指定source,字段必须对应起来,如果指定了source,字段可以任意命名
-source 可以指定字段,也可也指定方法
publish.test这是个方法,会执行该方法,并拿到返回结果
test = serializers.CharField(source='publish.test')
-3 SerializerMethodField,可以指定一个方法
publish=serializers.SerializerMethodField()
# 方法名:叫get_字段名,要传参数,参数是:当前book对象
def get_publish(self,obj):
# obj 是当前book对象
dic={'name':obj.publish.name,'email':obj.publish.email}
return dic
-方法内部可以继续用其他的序列化类
-ModelSerializer
-必须在类中写
class Meta:
model=指定表
# fields = '__all__'
# 指定只取这两个字段
fields = ['nid','name']
# 去掉指定的字段
# exclude=['publish','authors']
# fields,跟exclude不能连用
# 指定深度,就是跨几个表(官方建议小于10,我给你的建议小于3)
# depth = 2

Serializer小总结

Serializer序列化的跨表查询

在postman中的运行效果

效果不好的话将代码复制到www.json.cn中,可以折叠,看起来更清晰,即

如果不想写for循环,还有一种方法

在mySer中写上

# 作者的序列化的类
class AuthorSerializer(serializers.Serializer):
nid = serializers.CharField()
name = serializers.CharField()
age = serializers.CharField()

在图书序列化的类下面 写方法

# 通过上面的作者的序列化的类来实现
def get_authors(self, obj):
auths = obj.authors.all()
     
     #可以继续用序列化来处理
auth_ser=AuthorSerializer(auths,many=True)
return auth_ser.data

这样,在视图函数中一样能拿到图书的作者们

三:serializers.ModelSerializer序列化方法

第一种方式(类中类)

在mySer.py中

from app01.models import Book
class BookSerializer(serializers.ModelSerializer):
# 不用按字段,直接序列化到表模型
#必须写一个内部内,名字必须交Meta
class Meta:
model=Book
fields='__all__' #闹出book表的所有字段

postman运行结果会出现这样,publish和authors都是id

那么在

    #重写属性
publish=serializers.CharField(source='publish.name')

在mySer中写

 authors=serializers.SerializerMethodField()
def get_authors(self,book):
auths=book.authors.all()
auth_ser=AuthorSerializer(auths,many=True)
return auths.data

第二种方式:depth=? 深度(跨表查询,可控性查,效率低)

ModelSerializer
-必须在类中写
class Meta:
model=指定表
# fields = '__all__'
# 指定只取这两个字段
fields = ['nid','name']
# 去掉指定的字段
# exclude=['publish','authors']
# fields,跟exclude不能连用
# 指定深度,就是跨几个表(官方建议小于10,我给你的建议小于3)
# depth = 2

rest-framework之序列化组件的更多相关文章

  1. restful framework之序列化组件

    一.Django自带序列化组件 from django.core import serializers def test(request): book_list = Book.objects.all( ...

  2. Rest Framework:序列化组件

    Django内置的serializers(把对象序列化成json字符串 from django.core import serializers def test(request): book_list ...

  3. [Django REST framework - 序列化组件、source、钩子函数]

    [Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...

  4. Restful framework【第三篇】序列化组件

    基本使用 -序列化 -对象,转成json格式 用drf的序列化组件 -定义一个类继承class BookSerializer(serializers.Serializer): -写字段,如果不指定so ...

  5. 基于Django的Rest Framework框架的序列化组件

    本文目录 一 Django自带序列化组件 二 rest-framework序列化之Serializer 三 rest-framework序列化之ModelSerializer 四 生成hypermed ...

  6. django rest framework 序列化组件总结

    序列化组件总结 一. 序列化组件本质上为了实现前后端分离,而进行json序列化的一个组件形式,极大方便了解析数据的作用 二. 所有序列化是基于APIView 解析器实现的,通过内部的多继承关系方便实现 ...

  7. cvb源码分析,resful规范,drf,drf序列化组件,95

    1 CBV的源码分析 -Class Base View(基于类的视图) -Function Base View(基于函数的视图) -def as_view 类方法 -def view:类方法内部,闭包 ...

  8. drf 之序列化组件

    序列化 把Python中对象转换为json格式字符串 反序列化 把json格式转为为Python对象. 用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串. 序列化两大功能 ...

  9. Django Rest framework 之 序列化

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  10. rest-framework框架——APIView和序列化组件

    一.快速实例 Quickstart http://www.cnblogs.com/yuanchenqi/articles/8719520.html restful协议 ---- 一切皆是资源,操作只是 ...

随机推荐

  1. spring_JavaConfig

    从Spring 3起,JavaConfig功能已经包含在Spring核心模块,它允许开发者将bean定义和在Spring配置XML文件到Java类中. interface: package sprin ...

  2. oracle之 oradebug 命令用法

    0> oradebug使用步骤 1)启动sql*plus并以sysdba身份登入 2)连接到一个进程 3)设置一个事件或者进行诊断转储 4)检索trc文件名 5)与连接到的进程断开 1> ...

  3. 解决spring 事务管理默认不支持SQLException等运行时异常

    公司同事在定位一个bug时,发现spring默认的事务只支持运行时异常的回滚,对于像SQLException这样的非运行时异常,默认的事务机制不能处理,于是找了下解决的办法:    1.在捕获SQLE ...

  4. (转)使用PowerDesigner生成HTML功能

    本文转载自:http://www.cnblogs.com/CowboyProgrammer/archive/2009/04/28/1445423.html 使用PowerDesigner设计数据库关系 ...

  5. gcc及其选项详解

    1.简介: gcc是gnu旗舰产品,目前基本上就是和unix捆绑在一起分发的.这个东西功能强大,但是有多达上千个选项,其用户手册也有将近一万行.虽然其中的多数选项平时很少用到.但是不管装软件还是写程序 ...

  6. ORACLE GoldenGate在Windows与AIX平台ORACLE的单向、双向数据传输配置及其测试

    第1章...... GoldenGate概述 1.1         GoldenGate技术原理 1.2         GoldenGate可靠的复制 1.3         GoldenGate ...

  7. 如何在windows7中使用“专用字符编辑器”中的字

    工具/原料 win7电脑 系统自带的“专用字符编辑器” 系统自带的“字符映射表” 百度经验:jingyan.baidu.com 方法/步骤 1 点击开始→所有程序→附件→系统工具→专用字符编辑器: 步 ...

  8. jquery嵌套后会触发2次点击事件, jquery的unbind就是卸载这个点击事件的.

    $("#diva").click(function(){ $("#divb").unbind("click").click(function ...

  9. javascript中的垃圾回收

    1引用计数垃圾回收 核心:跟踪记录对象被引用的次数.思路是如果一个对象A被赋值给了一个变量v,则该对象A的引用计数值加1,如果变量v又被赋予其他值了,比如a="str",则该对象A ...

  10. Axure RP的基础使用

    Axure RP是一个专业的快速原型设计工具. 在上面可以直接设计软件的原型而且不涉及代码,例如设计软件的流程和界面之类的.简单的说,就是可以在上面编写界面,让人看起来像一个完整的软件一样. 设置完成 ...