• 序列化与restframework初识


    概述

    FBV和CBV的概念

    FBV   基于函数处理视图
    CBV    基于对象处理视图

    CBV的优点

    1  提高代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
    2  可以用不同的函数针对不同的HTTP方法处理,而不是通过多if判断,提高代码的可读性

    restful协议

    一切皆是资源,操作只是请求方式

    1. REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”;
    2. REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态;
    3. 对于所有的数据,不论是通过网络获取的的数据,还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性;
    4. 对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)

    restframework

    Django REST框架是一个功能强大且灵活的工具包,用于构建Web API。

    安装restframework

    cmd --> pip install djangorestframework

    序列化的三种方式

    方式一

    自己手动序列化

    publish_list = list(Publish.objects.all().values("name", "email"))
    return HTTPResponse(json.dumps(publish_list))

    方式二

    自己动手序列化

    publish_list = Publish.objects.all()
    temp = []
    for obj in publish_list:
        temp.append({
            "name": obj.name,
            "email": obj.email,
        })
    return HTTPResponse(json.dumps(temp))

    通过模块序列化

    from django.forms.models import model_to_dict
    publish_list = Publish.objects.all()
    temp = []
    for obj in publish_list:
        temp.append(model_to_dict(obj))
    
    return HTTPResponse(json.dumps(temp))

    方式三

    Django的序列化

    from django.core import serializers
    publish_list = Publish.objects.all()
    ret = serializers.serialize("json", publish_list)    # json是格式,publish_list是要序列化的queryset
    return HTTPResponse(ret)

    restframework的序列化

    基于serializers模块的序列化方式

    from rest_framework.response import Response
    from rest_framework import serializers
     
    class PublisherSerializers(serializers.Serializer):
        # 为queryset对象和model对象做序列化
        name = serializers.CharField()
        email = serializers.CharField()
    
    class BookSerializers(serializers.Serializer):
        title = serializers.CharField(max_length=32)
        price = serializers.IntegerField()
        pub_date = serializers.DateField()
    
        publish = serializers.CharField(source="publish.name")         # 一对多的序列化方式
        # authors = serializers.CharField(source="authors.all")     # 多对多的序列化方式
        authors = serializers.SerializerMethodField()               # 多对多的序列化方式(推荐,需要重写钩子函数)
    
        def get_authors(self, obj):
            """钩子函数"""
            temp = []
            for obj in obj.authors.all():
                temp.append(obj.name)
            return temp
    
    
    class PublishView(APIView):
    
        def get(self, request):
            publish_list = Publish.objects.all()
            ps = PublisherModerSerializers(publish_list, many=True)        # queryset对象需要传many=True(model_obj对象不用传)
            return Response(ps.data)
    
        def post(self, request):
            print("post")
            print(request.data)
            return HttpResponse("ok")

    基于ModelSerializer组件的序列化方式

    class BookModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = "__all__"
        
        # Hyperlinked 超链接API
        publish = serializers.HyperlinkedIdentityField(
            view_name="publish_detail",    # url别名
            lookup_field="publish_id",    # 循环中的字段
            lookup_url_kwarg="id",        # 分组名
        )
        
    class BookView(APIView):
        # 解析器
        # parser_classes = [JSONParser, ]
    
        def get(self, request):
            book_list = Book.objects.all()
            bs = BookModelSerializer(book_list, many=True, context={'request': request})  # 序列化类里有超链接API是必须传context
            return Response(bs.data)
        
        def post(self, request):
            # post请求的数据(生成记录)
            bs = BookModelSerializer(data=request.data, context={'request': request})    # 序列化类里有超链接API是必须传context
            print(request.data)
            if bs.is_valid():    # ModelSerializer可以做校验
                print(bs.validated_data)
                bs.save()        # create方法
                return Response(bs.data)
            else:
                return Response(bs.errors)
                    
    class BookDetailView(APIView):
    
        def get(self, request, id):
            """查看具体的某个数据"""
            book = Book.objects.filter(pk=id).first()
            bs = BookModelSerializer(book, context={'request': request})
            return Response(bs.data)
    
        def put(self, request, id):
            """更新具体的某个数据"""
            book = Book.objects.filter(pk=id).first()
            bs = BookModelSerializer(book, data=request.data, context={'request': request})
            if bs.is_valid():
                # 校验通过
                bs.save()    # update方法
                return Response(bs.data)
            else:
                return Response(bs.errors)
    
        def delete(self, request, id):
            """删除具体的某本书籍"""
            Book.objects.filter(pk=id).delete()
            return Response()
  • 相关阅读:
    [转]Windows visio2019破解激活
    KMP模式匹配算法
    【蓝桥杯2016_C++】t3:方格填数
    【蓝桥杯2015_C++】t4:格子中输出
    【蓝桥杯2015_C++】t3:奇妙的数字
    【蓝桥杯2014_C++】t6:扑克序列
    【蓝桥杯2014_C++】t4:史丰收速算
    【蓝桥杯2014_C++】t3:神奇算式
    【蓝桥杯2017_C++】t1:迷宫
    【蓝桥杯】买不到的数目
  • 原文地址:https://www.cnblogs.com/sunch/p/9993573.html
Copyright © 2020-2023  润新知