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

原文地址:https://www.cnblogs.com/lzqrkn/p/10084040.html

时间: 2024-08-30 06:40:54

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

RESTful【第三章】:序列化组件的使用及接口设计

序列化组件的使用及接口设计 一.Django原生的serializer(序列化) 使用步骤: 1.导入模块 from django.core.serializers import serialize 2.获取queryset 3.对queryset进行序列化 4.将序列化后的数据,响应给客户端 实例: #1.导入Django自带的原生的序列化模块 from django.core.serializers import serialize class CourseView(APIView): de

DRF--&gt;1 序列化组件的使用和接口设计---get

定义序列化器(本质就是一个类),一般包括模型类的字段,有自己的字段类型规则.实现了序列化器后,就可以创建序列化对象以及查询集进行序列化操作,通过序列化对象.data来获取数据(不用自己构造字典,再返回Json数据) 废话不多说,直接上代码!!! DRF序列化可以理解这几句 - 导入模块:from rest_framework import serializers - 建立一个序列化类 class BookSerializer(serializers.Serializer): 字段可以自定义 -

drf框架 - 序列化组件 | Serializer

序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 反序列化: 将字符串反序列化成对象用于使用 drf的序列化与反序列化 序列化: 将Model类对象序列化成字符串用户传输 反序列化: 将字符串反序列化成Model对象用于使用 Serializer 序列化准备: 模型层: models.py class User(models.Model): SE

drf框架 - 序列化组件

drf框架 - 序列化组件 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 反序列化: 将字符串反序列化成对象用于使用 drf的序列化与反序列化 序列化: 将Model类对象序列化成字符串用户传输 反序列化: 将字符串反序列化成Model对象用于使用 Serializer 序列化准备: 模型层: models.py class User(models.Model): SEX_CHOICES = [ [0, '男'], [1, '女'], ] name = models.CharFiel

django rest framework 解析器组件 接口设计,视图组件 (1)

一.解析器组件 -解析器组件是用来解析用户请求数据的(application/json), content-type 将客户端发来的json数据进行解析 -必须适应APIView -request.data触发 二.序列化组件 2.1.django 自带组件serializer 2.1.1 from django.serializers import serialize2.1.2 origin_data = Book.objects.all()2.1.3 serialized_data = se

drf框架序列化

目录 drf框架序列化 |反序列化: 序列化与反序列化: drf序列化与反序列化: 序列化: models.py Serializers.py Serializer 反序列化: views.py: ModelSerializers 指定表模型: 自定义反序列化方法: drf框架序列化 |反序列化: 序列化与反序列化: 序列化:对象转换为字符串用于传输 反序列化:字符串转换为对象用于使用 序列化是为了保持对象在内存中的状态,并且可以把保存的对象状态再读出来 a.数据持久化:比如一个电商平台,有数万

Java序列化——transient关键字和Externalizable接口

提到Java序列化,相信大家都不陌生.我们在序列化的时候,需要将被序列化的类实现Serializable接口,这样的类在序列化时,会默认将所有的字段都序列化.那么当我们在序列化Java对象时,如果不希望对象中某些字段被序列化(如密码字段),怎么实现呢?看一个例子: import java.io.Serializable; import java.util.Date; public class LoginInfo implements Serializable {     private stat

【Android】透明状态栏在App中的实现与接口设计

By Sodino 文章目录 1. 认识透明状态栏 2. 透明状态栏Api及特性 3. 设置透明状态栏 4. 处理消失的系统状态栏区域 5. fitsSystemWindows 6. Activity中的接口设计 7. Fragment中的接口设计 8. 白色Titlebar的处理 9. 小米 与 魅族 与 (莫名其妙的)华为 10. 腾讯优测UTest GitHub源码:TransparentStatusbar源码中分两个app TestBasic: 透明状态栏实现的示例,方便debug 白色

atitit.基于http json api 接口设计 最佳实践 总结o7

atitit.基于http  json  api 接口设计 最佳实践 总结o7 1. 需求:::serverand android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通參数 meth,param, 2 2.2. 全部的參数定义 2 2.3. key,dynami key)韩式 static key? 2 2.4. 防篡改 sign 2 2.5. Encry加密 3 2.6. zip压缩:: 3 2.7. 首先压缩韩式加密??? 3 3. 选型大全:rim ,ws, http