序列化组件的使用

一、序列化组件的简单使用

1、作用

把python中的对象转成json格式的字符串,一定要注意,如果前后端分离

json不能序列化对象,只能序列化列表和字典,所以这时候就用到了序列化组件

2、使用

①先在settings里注册rest_frameword

②新建一个py文件,序列化类继承Serializer,在类中写要序列化的字段

③在视图函数中使用序列化的类

from app01 import models
from rest_framework.views import APIView
from rest_framework.response import Response
from app01.myser import BookSerializer

# 把对象转成json格式字符串
class Books(APIView):
    def get(self, request):
        response = {‘code‘: 100, ‘msg‘: ‘查询成功‘}
        books = models.Book.objects.all()
        # 如果序列化多条,many=True(也就是queryset对象,就需要写)
        # 如果序列化一条(可以不写),instance是要序列化的对象
        bookser = BookSerializer(instance=books, many=True)   # instance指的是序列化的对象
        print(bookser.data)  # [OrderedDict([(‘name‘, ‘三国演义‘), (‘price‘, ‘11.00‘)]), OrderedDict([(‘name‘, ‘西游记‘), (‘price‘, ‘22.00‘)])]
        print(type(bookser.data))  # <class ‘rest_framework.utils.serializer_helpers.ReturnList‘>
        response[‘data‘] = bookser.data
        return Response(response)

前端显示:

二、高级用法

1、source:可以指定字段(name,publish.name),可以指定方法

①source=‘name‘

②source=‘publish.name‘

要拿choices的中文名,必须要指定source=‘get_字段名_display‘

③source指定方法:可以和SerializerMethodField搭配使用(get_字段名字)

2、write_only:序列化时,不显示(后端序列化到前端不显示)

 read_only:反序列化时,不传(read_only=True  就是前段传给后端可以不传)

3、重写create方法,实现序列化(新增数据)

在序列化类当中,如果不写create方法会调父类的create方法,直接进入父类的create方法,但是会直接抛异常,所以必须重写create方法,会把校验通过的数据传过来,然后再返回

  在序列化类中:

def create(self, validated_data):
    res = models.Book.objects.create(**validated_data)
    return res

  在视图函数中:继承了Serializers序列化类的对象,反序列化

def post(self, request):
    # 实例化产生一个序列化类的对象,data是要反序列化的字典
    bookser = BookSerializer(data=request.data)   # 这里的data指的是反序列化的字典
    if bookser.is_valid():
        # 清洗通过的数据,校验通过之后才会调用create方法
        # 注意:重写create方法的时候,一定要先校验通过了之后才能调用create方法
        res = bookser.create(bookser.validated_data)
    return Response()                

   Postman新增数据:

三、序列化的两种方式

1、Serializers:没有指定表模型。以上的用法都是这种方式

模型表:

from django.db import models

# Create your models here.

class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    publish_data = models.DateField(null=True)
    category = models.IntegerField(choices=((0, ‘文学类‘), (1, ‘情感类‘)), default=1, null=True)
    publish = models.ForeignKey(to=‘Publish‘, null=True)
    authors = models.ManyToManyField(to=‘Author‘)

    def __str__(self):
        return self.name

class Publish(models.Model):
    name = models.CharField(max_length=32)
    city = 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

详情见代码

在序列化类中:

from app01 import models
from rest_framework import serializers
class AuthorSerializer(serializers.Serializer):
    name = serializers.CharField()
    age = serializers.CharField()

class BookSerializer(serializers.Serializer):
    # source可以指定字段(name, publish.name),可以指定方法

    # 指定source=‘name‘ ,表示序列化模型表中的name字段,重名命为name5(name和source=‘name‘指定的name不能重名)
    # name_book = serializers.CharField(source=‘name‘)
    name = serializers.CharField()
    price = serializers.CharField()

    # write_only序列化的时候,该字段不显示
    # price = serializers.CharField(write_only=True)

    # 如果要取出版社的name,指定source=‘publish.name‘
    # publish = serializers.CharField(source=‘publish.name‘)

    # 要拿choices的中文名,必须要指定source=‘get_字段名_display‘
    book_type = serializers.CharField(source=‘get_category_display‘)

    # source指定方法
    # 序列化出版社的详情,指定SerializerMethodField之后,可以对应一个方法,返回什么内容,publish_detail就是什么内容
    # read_only,反序列化的时候,该字段不传
    publish_detail = serializers.SerializerMethodField(read_only=True)
    # 对应的方法固定写法get_字段名
    def get_publish_detail(self, obj):
        return {‘name‘: obj.publish.name, ‘city‘: obj.publish.city, ‘email‘: obj.publish.email}

    # 返回作者所有信息
    authors = serializers.SerializerMethodField()
    def get_authors(self, obj):
        # 这里可以用列表推导式,我们还可以在视图函数中使用序列化的类,
        # 序列化类继承Serializer,在类中写要序列化的字段
        authorser = AuthorSerializer(obj.authors.all(), many=True)
        return authorser.data

    def create(self, validated_data):
        res = models.Book.objects.create(**validated_data)
        return res

详情见代码

在视图函数中:

from django.shortcuts import render, HttpResponse

# Create your views here.

from app01 import models
from rest_framework.views import APIView
from rest_framework.response import Response
from app01.myser import BookSerializer

# 把对象转成json格式字符串
class Books(APIView):
    def get(self, request):
        response = {‘code‘: 100, ‘msg‘: ‘查询成功‘}
        books = models.Book.objects.all()
        # 如果序列化多条,many=True(也就是queryset对象,就需要写)
        # 如果序列化一条(可以不写),instance是要序列化的对象
        bookser = BookSerializer(instance=books, many=True)
        # print(bookser.data)  # [OrderedDict([(‘name‘, ‘三国演义‘), (‘price‘, ‘11.00‘)]), OrderedDict([(‘name‘, ‘西游记‘), (‘price‘, ‘22.00‘)])]
        # print(type(bookser.data))  # <class ‘rest_framework.utils.serializer_helpers.ReturnList‘>
        response[‘data‘] = bookser.data
        return Response(response)

    def post(self, request):
        # 实例化产生一个序列化类的对象,data是要反序列化的字典
        bookser = BookSerializer(data=request.data)
        if bookser.is_valid():
            # 清洗通过的数据,校验通过之后才会调用create方法
            # 注意:重写create方法的时候,一定要先校验通过了之后才能调用create方法
            res = bookser.create(bookser.validated_data)
        return Response()

详情见代码

2、ModelSerializers:指定了表模型

使用serializer需要写很多字段,尽可能简洁的就要使用ModelSerializer

总结:

原文地址:https://www.cnblogs.com/zhangguosheng1121/p/11123114.html

时间: 2024-09-30 15:24:07

序列化组件的使用的相关文章

第三章 restframework——序列化组件

第三章 restframework--序列化组件 一.django自带的序列化组件serializers 二.restframework的序列化组件Serializer 三.restframework的序列化组件ModelSerializer 四.restframework的序列化组件请求数据校验和保存功能(钩子) 五.restframework的序列化组件源码分析 一.django自带的序列化组件serializers from django.core import serializers d

Serializers 序列化组件

为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到的数据进行序列化. 接下来我们看下django序列化和rest_framework序列化的对比~~ Django的序列化方法 # 第一版 用values以及JsonResponse实现序列化(发现就简单的数据拿出来还这么费劲) class BookView(View): def get(self,

DRF--&gt;2序列化组件的使用和接口设计--get,post,put,delete&amp;优化组件

!!!!! !!!!! 记住这个图 !!!!! 上篇博客说道DRF序列化组件的get,只是简单的举一个实例,然而在现实生活中我们前后端进行交互的时候更多的用到了Json数据格式,这也就是说前后端交互的时候用到的更多序列化,但同时也会有大量的重复性的代码,举个简单的例子,就上片博客---get请求的时候,只是一个简单的get请求,还有put,updata,post,delete请求的时候呢,代码没有任何的优化,在这里我们再来说一下序列化和代码优化的结合,以供后来人参考,不多说直接上代码 1.这里我

RestFramework之序列化组件

一.restframework的序列化组件的使用 1.导入序列化组件与模型类 from rest_framework import serializers from app01.models import ( Book, Author, Publish ) 2.书写序列化类 # 创建一个序列化类 class BookSerializer(serializers.Serializer): ''' 开始使用序列化 - 导入模块:from rest_framework import serialize

RESTful【第三章】:序列化组件的使用及接口设计

序列化组件的使用及接口设计 一.Django原生的serializer(序列化) 使用步骤: 1.导入模块 from django.core.serializers import serialize 2.获取queryset 3.对queryset进行序列化 4.将序列化后的数据,响应给客户端 实例: #1.导入Django自带的原生的序列化模块 from django.core.serializers import serialize class CourseView(APIView): de

django rest framework 序列化组件总结

序列化组件总结 一. 序列化组件本质上为了实现前后端分离,而进行json序列化的一个组件形式,极大方便了解析数据的作用 二. 所有序列化是基于APIView 解析器实现的,通过内部的多继承关系方便实现进行数据序列化的实现 三 使用方式 1.基于APIView 引入  from rest_framework.views import APIView 2.返回的请求用 Response  from rest_framework.response import Response 3.开始进行创建序列化

$Django 序列化组件

1 序列化组件 from app01 import models from rest_framework import serializers from rest_framework.serializers import Serializer,ModelSerializer from django.http import JsonResponse class auth(Serializer): name=serializers.CharField() age=serializers.CharFi

Django框架(十九)—— 序列化组件(serializer)

目录 序列化组件 一.利用for循环来实现序列化(繁琐) 二.利用Django提供的序列化组件(不可控需要的字段) 三.利用drf提供的序列化组件 1.基于Serializer类实现序列化--基本语法 2.基于Serializer类实现序列化--高级语法 3.基于ModelSerializer类实现序列化 序列化组件 # 模型层 from django.db import models class Book(models.Model): nid = models.AutoField(primar

DRF解析组件以及序列化组件

一.知识点回顾: 1.三元运算: 三元运算能够简化我们的代码,请看如下代码: # 定义两个变量 a = 1 b = 2 # 判断a的真假值,如果为True,则将判断表达式的前面的值赋给c,否则将判断表达式后面的值赋给c c = a if a else b print(c) # 1 # 因为a的真假值判断为True,所以c为1 # 定义两个变量 a = 0 b = 2 # 判断a的真假值,如果为True,则将判断表达式的前面的值赋给c,否则将判断表达式后面的值赋给c c = a if a else

Serialzers 序列化组件

Serialzers 序列化组件 前言 当做前后端分离的项目时,JSON是一个轻量级的数据交互格式.所有我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到数据进行序列化 Django的序列化方法 使用django,json转数据进行传输,(了解即可) class BooksView(View): def get(self, request): # 获取数据库中的queryset数据 book_list = Book.objects.values("id", "