• 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"
    }))
  • 相关阅读:
    tuple 元组及字典dict
    day 49 css属性补充浮动 属性定位 抽屉作业
    day48 选择器(基本、层级 、属性) css属性
    day47 列表 表单 css初识
    day 46 http和html
    day 45索引
    day 44 练习题讲解 多表查询
    day 40 多表查询 子查询
    day39 表之间的关联关系、 补充 表操作总结 where 、group by、
    day38 数据类型 约束条件
  • 原文地址:https://www.cnblogs.com/zhangqing979797/p/10090756.html
Copyright © 2020-2023  润新知