*.Serializer与ModelSerializer都可以序列化与反序列化
序列化中的字段要与models表中的字段一致否则会报错
many=True实际上是使用了for循环
一对多序列化的思路
一对多序列化,首先创建外键表的序列化器,再创建本表的序列化器,在本表的序列化器中引用外键表的序列化
Serializer序列化 单表序列化
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import serializers
#自定义序列化器
class TeacherSerializer(serializers.Serializer):
name=serializers.CharField()
class Teacher(APIView):
def get(self,request):
alist=models.Teacher.objects.all()
#利用序列化器把数据集 变成 json格式 (注意:有instance,就是序列化,有many就是要序列化多条数据)
res=TeacherSerializer(instance=alist,many=True)
return Response({
'code':1,
'data':res.data
})
当序列化的表中由外键是这样搞:(相当于 一对多 )
class CourseSerializer(serializers.Serializer):
name=serializers.CharField()
#teacher这个字段是一个外键,这里引用TeacherSerializer这个序列化器,外键实际上就是一条数据,所以用被关联表的序列化器。
teacher=TeacherSerializer()
#把所有课程返回
class Course(APIView):
def get(self,request):
alist=models.Course.objects.filter()
course_data=CourseSerializer(instance=alist,many=True)
return Response({
'code':1,
'mes':course_data.data
})
多对多序列化(注意:一定要加many=True,many=True是说我这是多条数据,需要解析一下,如果不加序列化器会认为这是一条数据)
class CourseSerializer(serializers.Serializer):
name=serializers.CharField()
teacher=TeacherSerializer()
#把所有课程返回 多对一
class Course(APIView):
def get(self,request):
alist=models.Course.objects.filter()
course_data=CourseSerializer(instance=alist,many=True)
return Response({
'code':1,
'mes':course_data.data
})
#把所有的学生返回,对应的课程,课程的老师 都返回
class StuSerializer(serializers.Serializer):
name=serializers.CharField(max_length=30)
#注意: 因为是课程的多条数据需序列化所以+many=True
Course=CourseSerializer(many=True)
class Student(APIView):
def get(self,request):
blist=models.Stu.objects.filter()
res=StuSerializer(instance=blist,many=True)
return Response({
'code':1,
'mes':res.data
})
ModelSerializer序列化
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model=models.Course
fields="__all__"
#把所有课程返回 多对一
class Course(APIView):
def get(self,request):
alist=models.Course.objects.filter()
course_data=CourseSerializer(instance=alist,many=True)
return Response({
'code':1,
'mes':course_data.data
})