DRF-->2序列化组件的使用和接口设计--get,post,put,delete&优化组件
!!!!!

!!!!!
记住这个图
!!!!!
上篇博客说道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&优化组件的更多相关文章
- DRF-->1 序列化组件的使用和接口设计---get
定义序列化器(本质就是一个类),一般包括模型类的字段,有自己的字段类型规则.实现了序列化器后,就可以创建序列化对象以及查询集进行序列化操作,通过序列化对象.data来获取数据(不用自己构造字典,再返回 ...
- DRF(2) - 解析器,序列化组件使用(GET/POST接口设计)
一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...
- Restful 2 --DRF解析器,序列化组件使用(GET/POST接口设计)
一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...
- DRF(3) - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件
一.序列化组件 基于上篇随笔的表结构,通过序列化组件的ModelSerializer设计如下三个接口: GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} PU ...
- DRF - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件
一.序列化组件 基于上篇随笔的表结构 , 通过序列化组件的ModelSerializer设计如下三个接口 : GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} ...
- 解析器组件和序列化组件(GET / POST 接口设计)
前言 我们知道,Django无法处理 application/json 协议请求的数据,即,如果用户通application/json协议发送请求数据到达Django服务器,我们通过request.P ...
- drf框架 - 序列化组件 | Serializer
序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 ...
- Restful 3 -- 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件
一.序列化组件 基于上篇随笔的表结构,通过序列化组件的ModelSerializer设计如下三个接口: GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} PU ...
- 序列化组件(get/put/delete接口设计),视图优化组件
一 . 知识点回顾 1 . 混入类 , 多继承 class Animal(object): def eat(self): print("Eat") def walk(self): ...
随机推荐
- widget自定义控件【android.view.InflateException: Binary XML file line #2: Error inflating class...】
此错误比较难定位,场景是这样的:在一个widget中使用了自定义控件,始终会报 android.view.InflateException: Binary XML file line #2: Erro ...
- 关注java技术相关公众号
1.江南一点雨 关注公众号,回复 Java ,获取 Java干货! 个人博客:http://www.javaboy.org/ 2. 芋道源码 github地址:https://github.com/Y ...
- linux手动安装配置 mysql5.7
本文原出处地址 https://www.cnblogs.com/mujingyu/p/7689116.html 一.安装前的检查 1.1 检查 linux 系统版本 [root@localhost ...
- c语言判断是否是utf8字符串,计算字符个数
#include <stdio.h> #include <string.h> #include <stdlib.h> /********************** ...
- C# 链表 --增 -删-反转-删除最小值
1. Node.cs namespace 链表 { public class Node<T> { public T Data; //这个就是地址 public Node<T> ...
- Django之博客系统邮件分享博客
在上一章中,我们创建了一个基础的博客应用,我们能在http://127.0.0.1:8000/blog/显示我们的博客.在这一章我们将尝试给博客系统添加一些高级的特性,比如通过email来分享帖子,添 ...
- A. Theatre Square(math)
A. Theatre Square time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- CI框架源码学习笔记4——Benchmark.php
我们回到Codeigniter.php上继续往下看,第一个引入的类文件是Benchmark.php,这个文件主要是提供基准测试,具体使用方法参考手册http://codeigniter.org.cn/ ...
- sql遍历查询结果sql循环查询结果集sql循环查询
--查询表B,把查询到的数据插入临时表#A中,根据表B 的ID 进行排序:表#A中 的 i 字段 由1开始增加排序: SELECT ROW_NUMBER() OVER ( ORDER ...
- 2019.2.25考试T1, 矩阵快速幂加速递推+单位根反演(容斥)
\(\color{#0066ff}{题解}\) 然后a,b,c通过矩阵加速即可 为什么1出现偶数次3没出现的贡献是上面画绿线的部分呢? 考虑暴力统计这部分贡献,答案为\(\begin{aligned} ...