DRF 多对多的序列化和反序列化
一、 序列化
查询所有的学生的信息,包括任课老师
models.py
from django.db import models # 学生类 class Student(models.Model): name = models.CharField(max_length=32) # 老师类 class Teacher(models.Model): name = models.CharField(max_length=32) students = models.ManyToManyField(to='Student',related_name='teacher')
serializer.py
from rest_framework import serializers from . import models # 老师序列化 class TeacherSerializer(serializers.ModelSerializer): class Meta: model = models.Teacher fields = ('id','name') # 学生序列化 class StudentSerializer(serializers.Serializer): name = serializers.CharField(max_length=32) teacher = TeacherSerializer(many=True,read_only=True)
views.py
# 查询所有的学生对应的老师 studentobj = models.Student.objects.all() stu = StudentSerializer(studentobj,many=True) return Response(stu.data)
结果
# 结果 [ { "name": "小张", "teacher": [ { "id": 3, "name": "郑老师" } ] }, { "name": "小李", "teacher": [ { "id": 4, "name": "董老师" } ] }, { "name": "小夏", "teacher": [] }, { "name": "小徐", "teacher": [] } ]
查询所有老师,包括所教的学生
models.py
from django.db import models # 学生类 class Student(models.Model): name = models.CharField(max_length=32) # 老师类 class Teacher(models.Model): name = models.CharField(max_length=32) students = models.ManyToManyField(to='Student',related_name='teacher')
serializer.py
from rest_framework import serializers from . import models # 学生序列化 class StudentSerializer(serializers.ModelSerializer): class Meta: model = models.Teacher fields = ('id','name') # 老师序列化 class TeacherSerializer(serializers.Serializer): name = serializers.CharField(max_length=32) students = TeacherSerializer(many=True,read_only=True)
views.py
teacherobj = models.Teacher.objects.all() teach = TeacherSerializer1(teacherobj,many=True) return Response(teach.data)
结果
# 结果 [ { "name": "王老师", "students": [] }, { "name": "刘老师", "students": [] }, { "name": "郑老师", "students": [ { "id": 1, "name": "小张" } ] }, { "name": "董老师", "students": [ { "id": 2, "name": "小李" } ] } ]