zoukankan      html  css  js  c++  java
  • django rest framework 序列化组件总结

    序列化组件总结

    一.

    序列化组件本质上为了实现前后端分离,而进行json序列化的一个组件形式,极大方便了解析数据的作用

    二.

    所有序列化是基于APIView 解析器实现的,通过内部的多继承关系方便实现进行数据序列化的实现

    使用方式

    1.基于APIView 引入  from rest_framework.views import APIView

    2.返回的请求用  Response  from rest_framework.response import Response

    3.开始进行创建序列化类的方式  from rest_framework import serializers

    第一步 创建序列化类

    创建出在返回页面显示的字段 ,一对多关系同创建普通字段一样,无需特意声明关系,但需要引入sourse=publish.city

    多对多关系需要手动创建一个特定的方法

    第二步 创建需要解析的数据类 继承APIview 方法

    创建的方法要遵循rest请求规范

    1.获取需要传递的数据

    2.将数据传到序列化类中,返回一个实例化对象

    3.通过返回return Response (实例化对象.data)返回给页面

    优化

    一.问题

    在进行post 请求时,需要不断创建字段添加数据,很麻烦

    这样可以优化序列化类,引用serializers.ModelSerializer

    同form表单的modelform也一样,

    class META:

    model:

    fields:

    extra_ksargs: 这里添加关联字段用的 字典形式{

    'publish':{"write_only":true}

    "authors":{"write_only":true}

    }

    显示的字段

    publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
    publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city')


    手动创建的多对多数据

    视图优化

    即使优化了序列化类,但是发现数据类有很多的代码冗余,于是引入

    mixins: from rest_framework.mixins import (
    ListModelMixin,
    CreateModelMixin,
    DestroyModelMixin,
    UpdateModelMixin,
    RetrieveModelMixin
    )

    继承的apivies :from rest_framework.generics import GenericAPIView

    通过创建数据类引用的模块优化代码

    使用:

    1.引入模块

    2.创建类时有两个关键字段 quertset=找到的数据  serializer_class=引用的序列化类的名字

    3.返回请求的特殊方式

    def get(self,request, *args, **kwargs):
    return self.list(request, *args, **kwargs)
    def post(self,request, *args, **kwargs):
    return self.create(request, *args, **kwargs)

    4.urls 这里需要特定说明 引用 (?P<pk>d+) 来拼接

    path("course/",views.BookView.as_view()),
    re_path("course/(?P<pk>d+)/",views.BookFilterView.as_view())

      

    优化二

    但是发现依然有大量代码冗余

    于是引入接口逻辑新模块

    from rest_framework import generics
    通过
    generics.ListCreateAPIView 里面的内置方法省掉了 多余的def get/post 请求方法,都被封装的里面 
    但是会发现在查询 全部数据以及单个数据时候,需要创建两个数据类,可不可以用一个呢

    于是引出最终优化
     

    优化三

    引入from rest_framework.viewsets import ModelViewSet 模块

    这里更强大,只需要


    class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer


    就足够了
    但是在urls 里需要特意说明,,注意 都是引用一个视图函数哟
    re_path("course/$",views.BookView.as_view({
    "get":"list",
    "post":'create',
    })),
    re_path("course/(?P<pk>d+)/",views.BookView.as_view({
    'get':'retrieve',
    'put':"update",
    'delete':"destroy"
    }))
  • 相关阅读:
    xml在html中的使用
    getElementsByTagName的用法
    opener 的使用
    动态增加属性
    innerText, innerHTML,outerHTML
    button的css属性
    动态改变select中option的次序
    input 的样式
    zkw线段树
    接着吐槽(2012/5/23)
  • 原文地址:https://www.cnblogs.com/zhangqing979797/p/10090756.html
Copyright © 2011-2022 走看看