RESTFULL 02 序列化组件

RESTFULLL 序列化组件

一、Django自带序列化组件

? 内置的serializers(把对象序列化成json字符串)(一般不用)

from django.core import serializers

def test(request):
    book_list = Book.objects.all()
    ret = serializers.serialize("json", book_list)
    return HttpResponse(ret)

二、rest-framework序列化之Serializer

写一个类,继承Serializer
在类中写要序列化的字段
在View.py中使用
    book_ser=BookSerializer(book_list,many=True)
    book_ser.data   ----就是序列化后的数据
source的三种用法:
    1 指定字段
    2 指定方法
    3 深度查询(跨表)
SerializerMethodField,必须配合方法使用  get_字段名(self,obj),  obj是什么?当前要序列化的对象
SerializerMethodField对应的方法中还可以继续使用其他的序列化类

models

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

    def test(self):
        return str(self.price) + 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

from django.shortcuts import render
from django.http import JsonResponse
from app01 import models
from rest_framework.views import APIView
from rest_framework.response import Response
from app01.MySerializers import BookSerializer

# Create your views here.

class BooksView(APIView):
    # 不使用序列化组件
    # def get(self, request, *args, **kwargs):
    #     response = {'status': 100, 'msg': '成功'}
    #     book_list = models.Book.objects.all()
    #     book_ll = [{'id': book.pk, 'title': book.title, 'price': book.price} for book in book_list]  # 列表推导式
    #     response['data'] = book_ll
    #     # return JsonResponse(response, safe=False)
    #     # 需要在settings内注册rest_framework
    #     return Response(response)
    # 使用序列化组件
    def get(self, request, *args, **kwargs):
        response = {'status': 100, 'msg': '成功'}
        book_list = models.Book.objects.all()
        # 使用:实例化BookSerializer类,将要序列化的数据传如Queryset对象
        # 如果要序列化queryset对象,一定要加many=True
        book_ser = BookSerializer(book_list, many=True)
        response['data'] = book_ser.data
        return Response(response)

3 rest-framework序列化之ModelSerializer

写一个类继承ModelSerializer
在类内部写:
class Meta:
    model=models.Book
    fields='__all__'
    # exclude=['name','price']
    depth=1
重写属性

Myserializer

# 继承ModelSerializer,可以直接指定要序列化的表模型
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        # 指定要序列化book这个表
        model = models.Book
        # 指定要序列化的字段
        # fields=['nid','name']
        # 序列化所有字段
        fields = '__all__'

        # 选择要排除的字段(注意,不能跟fields连用)
        # exclude=['name','price']
        # 深度,官方建议最多写10,我个人建议最多写3
        # depth=1

    # publish=serializers.CharField(source='publish.name')
    # 显示出版社的详细信息
    publish = serializers.SerializerMethodField()

    def get_publish(self, obj):
        # print(type(obj))
        # print(obj)
        return {'id': obj.publish.pk, 'name': obj.publish.name}

    # 显示所有作者的信息
    authors = serializers.SerializerMethodField()

    def get_authors(self, obj):
        # 取到所有作者
        author_list = obj.authors.all()
        # author_ll=[ {'id':} for author in author_list]
        # 实例化一个作者的序列化类对象
        author_ser = AuthorSerializer(author_list, many=True)
        return author_ser.data      

4 查询单本书

? -books/1
? -序列化单条数据:book_ser=BookSerializer(instance=book,many=False)
? -注意book:不是queryset对象,是book对象

# 获取单本图书的接口
class BookView(APIView):
    def get(self, request, pk, *args, **kwargs):
        response = {'status': 100, 'msg': '获取成功'}
        # 取到pk为传入的pk的书,book对象
        book = models.Book.objects.all().filter(pk=pk).first()
        # 要序列化单条,many=False
        book_ser = BookSerializer(instance=book, many=False)
        # book_ser=BookSerializer(book,many=False)
        response['data'] = book_ser.data

        return Response(response)

5 新增一本书

-/books/--发送post请求,携带json格式数据

views.py

# 获取单本图书的接口
class BookView(APIView):
    def get(self, request, pk, *args, **kwargs):
        response = {'status': 100, 'msg': '获取成功'}
        # 取到pk为传入的pk的书,book对象
        book = models.Book.objects.all().filter(pk=pk).first()
        # 要序列化单条,many=False
        book_ser = BookSerializer(instance=book, many=False)
        # book_ser=BookSerializer(book,many=False)
        response['data'] = book_ser.data

        return Response(response)

6 反序列化之局部,全局钩子(序列化的类一定是继承ModelSerializer的类

# 局部钩子
def validate_name(self,value):
    if value.startswith('sb'):
        #不能让你过
        raise ValidationError('书名不能以sb开头')
    else:
        return value
#全局钩子函数,对全局字段进行校验
def validate(self,a):
    # print(a)
    name=a.get('name')
    price=a.get('price')
    if name != price:
        raise ValidationError('错了')
    else:
        return a

原文地址:https://www.cnblogs.com/Yedada/p/10602759.html

时间: 2024-07-31 02:04:21

RESTFULL 02 序列化组件的相关文章

Java 之 I/O 系列 02 ——序列化(二)

Java 之 I/O 系列 目录 Java 之 I/O 系列 01 ——基础 Java 之 I/O 系列 02 ——序列化(一) Java 之 I/O 系列 02 ——序列化(二) 继续上篇的第二个问题 如果一个类实现了Serializable接口,但是它的父类没有实现 ,这个类可不可以序列化? Object是每个类的超类,但是它没有实现 Serializable接口,但是我们照样在序列化对象,所以说明一个类要序列化,它的父类不一定要实现Serializable接口.但是在父类中定义 的状态能被

Java 之 I/O 系列 02 ——序列化

Java 之 I/O 系列 目录 Java 之 I/O 系列 01 ——基础 Java 之 I/O 系列 02 ——序列化 一 序列化概述 序列化,简单来讲,就是以“流”的方式来保存对象,至于保存的目标地址,可以是文件,可以是数据库,也可以是网络,即通过网络将对象从一个节点传递到另一个节点. 在Java的I/O结构中,有ObjectOutputStream和ObjectInputStream,它们可以实现将对象输出为二进制流,并从二进制流中获取对象,那为什么还需要序列化呢?这需要从Java变量的

第三章 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-->2序列化组件的使用和接口设计--get,post,put,delete&优化组件

!!!!! !!!!! 记住这个图 !!!!! 上篇博客说道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