!!!!!

!!!!!

记住这个图

!!!!!

上篇博客说道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

最新文章

  1. 把生成的excel文件直接提供为下载页效果
  2. highcharts基本配置和使用highcharts做手机端图标
  3. JSON.stringify()和JSON.parse()
  4. GNU/Linux复习笔记(2)
  5. SQL Server 2012 安装
  6. STM32F103ZET6 用定时器级联方式输出特定数目的PWM(转载)
  7. python之类的属性
  8. .NET 请求被挂起,前端轮询,委托
  9. 深拷贝与浅拷贝(mutableCopy与Copy)详解 iOS
  10. js屏蔽浏览器右键菜单
  11. [1] Report Fusioncharts
  12. JavaBean,List,Map,json格式之间转化方式
  13. k8s list
  14. [Swift]LeetCode308. 二维区域和检索 - 可变 $ Range Sum Query 2D - Mutable
  15. ThreadPoolExecutor系列三——ThreadPoolExecutor 源码解析
  16. 存储专栏:一句话说清RAID2.0
  17. springmvd接收参数问题
  18. anemometer安装
  19. 【2019北京集训3】逻辑 树剖+2-sat
  20. 基于MVC4+EasyUI的Web开发框架形成之旅(4)--附件上传组件uploadify的使用

热门文章

  1. Leafletjs学习教程和相关代码整理
  2. SQL:bat批处理多个.sql文件
  3. Python2闭包问题
  4. 最全PyCharm教程--for python
  5. python---scipy模块
  6. Dynamic Rankings(整体二分)
  7. truts2标签-forEach标签
  8. kuangbin专题十二 HDU1087 Super Jumping! Jumping! Jumping! (LIS)
  9. Java Applet 素数小程序
  10. [Android]Android开发艺术探索第1章笔记