!!!!!

!!!!!

记住这个图

!!!!!

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

1.这里我们直接用我们上片博客的代码示例,表的结构以及数据的迁移可以参考上片博客

2.我们直接来看urls

urlpatterns = [
re_path(r'books/$',views.BookView.as_view({
#这里的get就是请求数据,可以理解是查看
'get',:'list',
#这里的post就是请求数据,可以理解提交数据
'post':'create'
})'),
re_path(r'books/(?P<pk>\d+)/$',views.BookView.as_view({
#这里的get是请求数据,可以理解是查看单条数据
'get':'retrieve',
#这里的putr是请求数据,可以理解是修改
'put':'update',
#这里的delete就是请求数据,可以理解是删除
'delete':destory'
}))
]

2.

views.py
from rest_framwork.viewsets import ModelViewSetfrom rest_framework import serializers
from app1.models import Book,Publish,Author #注意这里必须继承ModelSerializer,这里只有它的源码里给我们封装了我们需要的东西
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = (
'title',
'price',
'publish',
'author_list',
'publish_name',
'publish_city'
)
extra_kwargs = {
'publish':{'write_only': True},
'authors':{'write_only': True}
}
  #这里是外键字段,就是__str__显示字段,source='publish.name'就是为了我们能够更清楚地知道我们显示的字段是什么,read_only我们只读不写
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')
#这里是固定写法;serializers.SerializerMethodField()
author_list = serializers.SerializerMethodField()
#这里在说一下 author_list
def get_author_list(self, book_obj):
authors = list()
for author in book_obj.authors.all():
authors.append(author.name)
print(authors)
return authors class Book(ModelViewSet):
queryset = Book.objects.all()
#注意,这里的都是固定的写法,除了BookSerializer,它是需要我们进行序列化类的名字一致,否则找不到报错
serializer_class = BookSerializer

3.是不是感觉很乱?ok,显示开发中我们不可能这样,我们新建文件夹,把我们代码进行一个解耦

app1_serializers.py
from rest_framework import serializers
from app1.models import Book,Publish,Author class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = (
'title',
'price',
'publish',
'author_list',
'publish_name',
'publish_city'
)
extra_kwargs = {
'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') author_list = serializers.SerializerMethodField() def get_author_list(self, book_obj):
authors = list()
for author in book_obj.authors.all():
authors.append(author.name)
print(authors)
return authors #现在我们的代码就完全优化完了,现在urls两条,而我们的类只有一个,剩下的逻辑基本都在 app1_serializers.py脚本里,ok

DRF-->2序列化组件的使用和接口设计--get,post,put,delete&优化组件的更多相关文章

  1. DRF-->1 序列化组件的使用和接口设计---get

    定义序列化器(本质就是一个类),一般包括模型类的字段,有自己的字段类型规则.实现了序列化器后,就可以创建序列化对象以及查询集进行序列化操作,通过序列化对象.data来获取数据(不用自己构造字典,再返回 ...

  2. DRF(2) - 解析器,序列化组件使用(GET/POST接口设计)

    一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...

  3. Restful 2 --DRF解析器,序列化组件使用(GET/POST接口设计)

    一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...

  4. DRF(3) - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件

    一.序列化组件 基于上篇随笔的表结构,通过序列化组件的ModelSerializer设计如下三个接口: GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} PU ...

  5. DRF - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件

    一.序列化组件 基于上篇随笔的表结构 , 通过序列化组件的ModelSerializer设计如下三个接口 : GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} ...

  6. 解析器组件和序列化组件(GET / POST 接口设计)

    前言 我们知道,Django无法处理 application/json 协议请求的数据,即,如果用户通application/json协议发送请求数据到达Django服务器,我们通过request.P ...

  7. drf框架 - 序列化组件 | Serializer

    序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 ...

  8. Restful 3 -- 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件

    一.序列化组件 基于上篇随笔的表结构,通过序列化组件的ModelSerializer设计如下三个接口: GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} PU ...

  9. 序列化组件(get/put/delete接口设计),视图优化组件

    一 . 知识点回顾 1 . 混入类 , 多继承 class Animal(object): def eat(self): print("Eat") def walk(self): ...

随机推荐

  1. widget自定义控件【android.view.InflateException: Binary XML file line #2: Error inflating class...】

    此错误比较难定位,场景是这样的:在一个widget中使用了自定义控件,始终会报 android.view.InflateException: Binary XML file line #2: Erro ...

  2. 关注java技术相关公众号

    1.江南一点雨 关注公众号,回复 Java ,获取 Java干货! 个人博客:http://www.javaboy.org/ 2. 芋道源码 github地址:https://github.com/Y ...

  3. linux手动安装配置 mysql5.7

    本文原出处地址  https://www.cnblogs.com/mujingyu/p/7689116.html 一.安装前的检查 1.1 检查 linux 系统版本 [root@localhost ...

  4. c语言判断是否是utf8字符串,计算字符个数

    #include <stdio.h> #include <string.h> #include <stdlib.h> /********************** ...

  5. C# 链表 --增 -删-反转-删除最小值

    1. Node.cs namespace 链表 { public class Node<T> { public T Data; //这个就是地址 public Node<T> ...

  6. Django之博客系统邮件分享博客

    在上一章中,我们创建了一个基础的博客应用,我们能在http://127.0.0.1:8000/blog/显示我们的博客.在这一章我们将尝试给博客系统添加一些高级的特性,比如通过email来分享帖子,添 ...

  7. A. Theatre Square(math)

    A. Theatre Square time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  8. CI框架源码学习笔记4——Benchmark.php

    我们回到Codeigniter.php上继续往下看,第一个引入的类文件是Benchmark.php,这个文件主要是提供基准测试,具体使用方法参考手册http://codeigniter.org.cn/ ...

  9. sql遍历查询结果sql循环查询结果集sql循环查询

    --查询表B,把查询到的数据插入临时表#A中,根据表B 的ID 进行排序:表#A中 的 i  字段 由1开始增加排序:        SELECT ROW_NUMBER() OVER ( ORDER ...

  10. 2019.2.25考试T1, 矩阵快速幂加速递推+单位根反演(容斥)

    \(\color{#0066ff}{题解}\) 然后a,b,c通过矩阵加速即可 为什么1出现偶数次3没出现的贡献是上面画绿线的部分呢? 考虑暴力统计这部分贡献,答案为\(\begin{aligned} ...