DRF框架之 serializers 序列化组件

1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式

2. DRF框架自带序列化的工具: serializers

3. DRF框架 serializers 分为:第一种 Serializer   第二种 ModelSerializer

第一种用法之 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

    def test(self):    #注意: 这里是给后面序列化组件的source指定方法用的
        return str(self.price)+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

models层先创建数据表

from  rest_framework import serializers
from app.models import Book,Author

####################这里是serializers 实例化方法一的实现
#
class Bookserializer(serializers.Serializer):
    # 这里是通过rest_framwork 来实例化对象中的内容,返回给前端的数据信息
    id = serializers.CharField()
    # source指定数据库中的名字,前面可以自定义名字来使用,给前端显示的是自定义名字 bookname 是自己自定义的名字
    bookname = serializers.CharField(source=‘name‘)

    price = serializers.CharField()
    # source还可以通过对象继续点其他属性, 可以跨表点其他的想要的属性(这个只是拿到publish的单个字段)
    publish_name = serializers.CharField(source=‘publish.name‘)
    #注意source 还可以调用models中 Book 表内的方法
    maxprice = serializers.CharField(source=‘test‘)

#注意,source 可以名字自定义显示,可以跨表链接其他想要的属性,还可以调用book表中的自定义的方法
    # publish字段,返回出版社的所有信息,包括id,name,email。。。。
    #     #SerializerMethodField配合一个方法,方法的返回值会付给publish
    #SerializerMethodField 可以拿到跨表内的多个字段,你吧想要的都返还回去就行了(这里是拿到publish的多个字段信息)
    publish = serializers.SerializerMethodField()
    #这里这里的obj 是当前序列化的对象 这里的对象就是book!!!!
    def get_publish(self,obj):
        return {‘id‘:obj.publish.pk, ‘name‘: obj.publish.name,‘city‘:obj.publish.city}

####################这里是serializers 实例化方法一的实现

自己创建个py文件,写上序列化显示的内容

第二种用法之ModelSerializer

###################这里是serializers实例化实现方法二 的实现,调用ModelSerializer
class Bookserializer(serializers.ModelSerializer):
    #这里一个meta类去调用Book这个表
    class Meta:
        model = models.Book
        #fields  是然他显示所有的内容,渲染出去
        fields = "__all__"         # ‘__all__‘ 是渲染全部出去
#         #fields = [‘id‘, ‘name‘]     # [‘....‘] 是渲染指定的
#         # exclude=[‘name‘]            #是除了name 之外的全部都渲染出去,不能和fields同时出现
#         #depth = 3                   #深度 ,官方建议最多写10,深度显示所有的表
#
    #这里是可以自定义,自定义显示publish的名字,
    publish_name = serializers.CharField(source=‘publish.name‘)
    publish = serializers.SerializerMethodField()
    #也可以拿到publish的多个字段信息
    def get_publish(self,obj):
        return {‘id‘:obj.publish.pk, ‘name‘:obj.publish.name}

###################这里是serializers实例化实现方法二 的实现,调用ModelSerializer
最后建议使用serializers.ModelSerializer 来实现序列化 ,因为在修改接口和添加接口 对save() 有很好的依赖关系

第二种序列化的方法(建议这种)

# 局部钩子函数,对单个字段校验
    #校验name字段不能以sb开头
    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

使用第二种后面还可以跟着写局部钩子和全局钩子用于反序列化

最后视图函数调用序列化的内容并返回给前端进行渲染处理

在View视图层操作:

 查询多本书的方法:
from rest_framework.views import APIView
from rest_framework.response import Response
from app.models import Book
from app.Myserialize import Bookserializer

class Books(APIView):  # 这个是获取多本书的接口

    def get(self, request, *args, **kwargs):  # 这里是通过对drf框架 使用cbv 的get请求
        response = {‘status‘: 100, ‘msg‘: ‘获取成功‘}  # 设置发送出去response 信息
        book_list = Book.objects.all()
        book_ser = Bookserializer(book_list, many=True)  # 使用drf 实例化 自定义的Bookserializer 来实例化
        response[‘data‘] = book_ser.data  # 把实例化book_ser 的data数据放入 response[‘data‘]中
        return Response(response)  # 在使用Response来返回出去

    def post(self, request):        #这个是添加书的接口
        response = {‘status‘: 100, ‘msg‘: ‘添加成功‘}

        try:
            book_ser = Bookserializer(data=request.data)
            if book_ser.is_valid():         #这里就是晕倒的反序列的内部工具和钩子判断
                book_ser.save()
                response[‘data‘] = book_ser.data    #判断通过吧数据返回出去
            else:
                response[‘msg‘] = book_ser.errors
        except Exception as e:
            response[‘msg‘] = str(e)
        return Response(response)

简单的调用序列化好的内容,并反馈给前端消息

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)

    def put(self,request,pk):     #修改某本书
        response = {‘status‘: 100, ‘msg‘: ‘修改‘}
        book=models.Book.objects.filter(pk=pk).first()
        #修改
        book_ser = BookSerializer(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            response[‘data‘]=book_ser.data
        else:
            response[‘msg‘]=book_ser.errors
        return Response(response)

接口显示单个内容 ,主要PK是关键点

在路由层的配置:
urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^books/$‘, views.BooksView.as_view()),    #查看全部书的接口
    url(r‘^books/(?P<pk>\d+)‘, views.BookView.as_view()),   #查看单个书的接口
]

在urls 路由层进行判断

#总结,个人建议使用第二种序列化的方法,这样对反序列化有很好的帮助



以下是全部的接口信息

from  app import  models
from  app.Myserializers import  BookSerializers

# Create your views here.
from rest_framework.views import  APIView
from rest_framework.response import Response

class Booksview(APIView):

    def get(self,request,*args,**kwargs):       #获取多本书
        response = {‘status‘:100, ‘msg‘:‘查询成功‘}
        book_list = models.Book.objects.all()
        book_ser = BookSerializers(book_list,many=True)
        response[‘data‘] = book_ser.data
        return Response(response)

    def post(self,request):                     #添加书
        response = {‘status‘:100, ‘msg‘:‘添加成功‘}
        try:
            book_ser = BookSerializers(data=request.data)   #序列化工具拿到的数据是在request.data内的字典中获取
            if book_ser.is_valid(): #进行钩子判断与基础验证
                book_ser.save()
                response[‘data‘] =book_ser.data
            else:
                response[‘msg‘]= book_ser.errors
        except Exception as e:
            response[‘msg‘] =str(e)
        return  Response(response)

class Bookview(APIView):

    def get(self, request, pk, *args, **kwargs):        #获取单本书的接口
        response = {‘status‘:100 , ‘msg‘: ‘获取成功‘}
        book = models.Book.objects.all().filter(pk=pk).first()
        book_ser = BookSerializers(instance=book,many=False)
        response[‘data‘] = book_ser.data
        return  Response(response)

    def put(self, request,pk):          #修改但本书的接口
        response = {‘status‘:100, ‘msg‘:‘修改成功‘}
        book = models.Book.objects.filter(pk=pk).first()
        book_ser = BookSerializers(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            response[‘data‘]= book_ser.data
        else:
            response[‘msg‘]= book_ser.errors
        return  Response(response)

    def delete(self,request,pk):        #删除的接口
        response = {‘status‘:100, ‘msg‘: ‘删除成功‘}
        book = models.Book.objects.filter(pk=pk).delete()
        return Response(response)

以下是通过cbv实现的简单的五种请求的接口实现方式

原文地址:https://www.cnblogs.com/gukai/p/10780292.html

时间: 2024-10-29 09:57:13

DRF框架之 serializers 序列化组件的相关文章

Serializers 序列化组件

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

django rest_framework Serializers 序列化组件

为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到的数据进行序列化. 接下来我们看下django序列化和rest_framework序列化的对比~~ Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objects.values("id&quo

DRF框架之Serializer序列化器的序列化操作

在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer. 今天,我们就先来学习一下Serializer序列化器. 使用Serializer序列化器的开发步骤: 1. 定义Serializer序列化器 首先,我们要在子应用中,创建见一个serializers.py文件,用来编写Serializer序列化器代码. from rest_framework import serializers # 定义序列化器 class BookInfoSerializer

DjangoRestFramework学习二之序列化组件、视图组件

目录 DjangoRestFramework学习二之序列化组件.视图组件 一 序列化组件 二 视图组件(Mixin混合类) DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 首先按照restful规范咱们创建一些api接口,按照下面这些形式写吧: Courses --- GET ---> 查看数据----->返回所有数据列表[{},{},] Courses--- POST --->添加数据 -----> 返回添加的数据{ } course

19.DjangoRestFramework学习二之序列化组件、视图组件

一 序列化组件 首先按照restful规范咱们创建一些api接口,按照下面这些形式写吧: Courses --- GET ---> 查看数据----->返回所有数据列表[{},{},] Courses--- POST --->添加数据 -----> 返回添加的数据{ } courses/1 ---PUT---> 更新pk=1的数据 ----->返回更新后的数据{ } courses/1 --- DELETE---> 删除pk=1的数据 -----> 返回空

Django中rest_framework的APIView,序列化组件和视图组件

url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^books/$', views.BookHandle.as_view()), url(r'^books/(\d+)', views.GetBookHandle.as_view()), url(r'^publishs/$', views.PublishHandel.as_view()), ] views #####################################

drf框架 - 序列化组件

drf框架 - 序列化组件 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 反序列化: 将字符串反序列化成对象用于使用 drf的序列化与反序列化 序列化: 将Model类对象序列化成字符串用户传输 反序列化: 将字符串反序列化成Model对象用于使用 Serializer 序列化准备: 模型层: models.py class User(models.Model): SEX_CHOICES = [ [0, '男'], [1, '女'], ] name = models.CharFiel

drf框架 - 序列化组件 | Serializer

序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 反序列化: 将字符串反序列化成对象用于使用 drf的序列化与反序列化 序列化: 将Model类对象序列化成字符串用户传输 反序列化: 将字符串反序列化成Model对象用于使用 Serializer 序列化准备: 模型层: models.py class User(models.Model): SE

drf框架 2 drf框架的请求生命周期(as_view和dispatch方法), 请求、解析、渲染、响应、异常, 序列化组件 ,ORM配置回顾(media文件配置),应用在settings.py中INSTALLED_APPS注册意义 ,数据库配置

应用是否需要在INSTALLED_APPS中注册 ''' 在没有使用到app的一些特殊操作时(比如数据库相关),不需要app的__init__文件注册时,文件夹可以不用注册,但是注册后,应用的所有功能都能使用 结论:所有应用都可以完成注册 ''' 数据库配置(全部在settings文件中完成即可) import pymysql pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends