• 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
  • 相关阅读:
    Beta冲刺第三天
    Beta冲刺第二天
    C#编程(三十三)----------Array类
    ComputeColStats UDF中 近似算法的介绍(续)
    云计算技术第三堂课20210317
    云计算与信息安全第三堂课20210316
    操作系统第三堂课20210315
    ROSPlan教程
    机器学习第二堂课20210311
    云计算技术第二堂课20210310
  • 原文地址:https://www.cnblogs.com/lzqrkn/p/10084040.html
Copyright © 2020-2023  润新知