!!!!!

!!!!!

记住这个图

!!!!!

上篇博客说道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. WebGoat系列实验Injection Flaws

    WebGoat系列实验Injection Flaws Numeric SQL Injection 下列表单允许用户查看天气信息,尝试注入SQL语句显示所有天气信息. 选择一个位置的天气,如Columb ...

  2. C#与数据库访问技术总结(三)之 Connection对象的常用方法

    说明:前面(一)(二)总结了数据库连接的概念以及连接数据库的字符串中的各个参数的含义.这篇随笔介绍connection对象的常用方法. Connection对象的常用方法 Connection类型的对 ...

  3. 【转】C# 中的委托和事件(详解)

    源地址:http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html

  4. 51nod1478(yy)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1478&judgeId=365133 题意: 中文题诶 ...

  5. [Oracle入门级]知识概况

    oracle各个版本间的主要技术更新 oracle 增加数据库创建和存储对象 oracle 8i 整体性能提升 oracle9i 实施应用集群 oracle 10g 支持网格计算 oracle 11g ...

  6. js window.open()打开的页面关闭后刷新父页面

    function test(){ var winObj = window.open(URL); var loop = setInterval(function(){ if(winObj.closed) ...

  7. UncategorizedSQLException Mybatis中jdbcType的作用

    使用MyBatis框架做更新操作时,在该字段需要更新的内容为空时,就会出现1111错误,也就是无效的列类型,这个时候你就要使用jdbcType.至于什么时候要使用到javaType我还没遇到过,而且我 ...

  8. 2019年GPLT L2-4 彩虹瓶 比赛题解 中国高校计算机大赛-团体程序设计天梯赛题解

    彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里. 假设彩虹瓶里要按顺序装 N 种颜色的小球(不妨将顺序就编号为 1 到 N).现 ...

  9. 牛客寒假算法基础集训营4 F Applese 的QQ群

    链接:https://ac.nowcoder.com/acm/contest/330/F来源:牛客网 Applese 有一个QQ群.在这个群中,大家互相请教问题.如 b 向 a 请教过问题,就把 a ...

  10. java 实现导出Excel文件

    java 实现导出Excel(java生成 excel 并导出文件) 经常有有一些数据需要导出成   excel  格式 ,所以就需要实现啦 开始: 1.加入jar poi-3.6-20091214. ...