序列化最终代码(下边的可以不看)
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)