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)
原文地址:https://www.cnblogs.com/djfboai/p/10061724.html