zoukankan      html  css  js  c++  java
  • AI-序列化-查-做接口

    序列化最终代码(下边的可以不看)

    from rest_framework.views import APIView
    from rest_framework import serializers
    from rest_framework.response import Response
    from app01.models import Book
    
    class BookSerializer(serializers.ModelSerializer):  #ModelSerializer可以将指定的表里所有数据展示出来
        class Meta:
            model=Book   #定义需要传输的数据的表
            # fields=["title","price"]  可以指定传送的字段
            fields="__all__"  #传送表Book所有数据
        
        #如果前端需要的不是书籍id而是数据名称,加这个即可!
        # publish=serializers.CharField(max_length=32,source="publish.name")
        authors=serializers.SerializerMethodField()
        def get_authors(self,obj):
            ret=[]
            for i in obj.authors.all():
                ret.append({"name":i.name,"pk":i.pk})
            return ret
    
    
    class BookView(APIView):
    
        def get(self,request):
            book_list=Book.objects.all()
            serializer=BookSerializer(book_list,many=True)
            return Response(serializer.data)
    
    
        def post(self,request):
            serializer=BookSerializer(data=request.data,many=False) #默认为False
    
            if serializer.is_valid():
                serializer.save() # create操作
    
                return Response(serializer.data) #拿到数据
            else:
                return Response(serializer.errors) #报错提醒

    序列化完整版的解释

    一个表多个正常字段的处理

    一个表中如果有多个字段,不能使用course.desc这种方式来传数据,太麻烦了!所以使用drf的序列化组件!

    做GET接口:

    
    
    from rest_framework.response import Response  # Response和httpresponse一样,增加了数据结构化
    from rest_framework import serializers
    class CourseSerializer(serializers.Serializer): 
        title=serializers.CharField(max_length=32)  #增加了认证功能
        desc=serializers.CharField(max_length=32)
    
    class Courseview(APIView):
    
        def get(self,request):
    
            # 使用序列化传数据
            course_list=Course.objects.all()
            cs=CourseSerializer(course_list,many=True)  #如果有多个字段,不可能使用course.desc这种方式,需要序列化简便!
            print(cs.data)  #序列化接口
            return Response(cs.data)  #我的序列化接口

    效果:(使用response结构化、使用序列化组件后的数据)

      

    做POST请求:

        def post(self,request):
    
            print(request.data)
            cs=CourseSerializer(data=request.data)  #默认many=False
            if cs.is_valid(): #校验 
                Course.objects.create(**request.data)  #在数据库中添加数据
                return Response(cs.data) #序列化数据
            else:
                return Response(cs.errors) # 序列化错误信息

    添加数据后效果:

    一个表不同类型字段的处理

    from rest_framework.views import APIView
    from rest_framework import serializers
    from rest_framework.response import Response
    from app01.models import Book
    
    class BookSerializer(serializers.Serializer):
    
        title = serializers.CharField( max_length=32)
        price =serializers.DecimalField(max_digits=5,decimal_places=2)
    
        # 一对多字段
        publish_email=serializers.CharField(max_length=32,source="publish.email")
        publish_name=serializers.CharField(max_length=32,source="publish.name")
    
        # 多对多字段
        #authors=serializers.CharField(max_length=32,source="authors.all")
        authors=serializers.SerializerMethodField()
        def get_authors(self,obj):
            ret=[]
            for i in obj.authors.all():
                ret.append(i.name)
            return ret



    class BookView(APIView):

    def get(self,request):
    book_list=Book.objects.all()
    serializer=BookSerializer(book_list,many=True)
    return Response(serializer.data)
  • 相关阅读:
    c++笔试题3
    C++笔试题
    C++编程指南续(10-11)
    C++详解(8-9)
    C++编程指南(6-7)
    C++编程指南续(4-5)
    C++编程指南续
    C++的编程指南
    HPSocket介绍与使用
    WinForm中TreeView控件实现鼠标拖动节点(可实现同级节点位置互换,或拖到目标子节点)
  • 原文地址:https://www.cnblogs.com/djfboai/p/10061724.html
Copyright © 2011-2022 走看看