我们之前创建了四个模型,学校模型,教师模型,学生模型,教师学生模型。其关系如下:
学校和教师是一对多,学校和学生也是一对多,而教师和学生是多对多。
现在,我们需要一个学校列表 ,同时显示每个学校的所有教师,和每个教师教的所有学生。
理一下思路,大致分为以下几步:
1 学校模型找教师模型:通过教师模型中与学校关联的字段进行反查
2 教师找教师学生模型:通过教师学生模型中与教师关联的字段进行反查
3 教师学生模型找学生:通过教师学生模型中与学生关联的字段进行顺查
于是,代码实现的思路如下:
1 建立学生序列化器
2 建立教师学生序列化器,在该序列化器中引入学生序列化信息
3 建立教师序列化器,在该序列化器中引入教师学生序列化信息
4 建立学校序列化器,在该序列化器中引入教师序列化信息
1 视图及序列化器代码
from rest_framework import serializers from Applications.Examples.models import Schools, Teachers, Students, TeacherAndStudent from rest_framework.viewsets import ModelViewSet class StudentSerializer(serializers.ModelSerializer): """ 【功能描述】单模型序列化器 """ class Meta: model = Students fields = '__all__' class TeacherAndStudentSerializer(serializers.ModelSerializer): """ 【功能描述】主从模型序列化器</br> 【特别提醒】本序列化器中的student是关联字段,模型中有student字段,而当我们要根据student字段找到student详情时, 使用顺查,结果是一个学生id对应一个学生,所以,不能加many=True """ student = StudentSerializer(read_only=True) class Meta: model = TeacherAndStudent fields = '__all__' class TeacherSerializer(serializers.ModelSerializer): """ 【功能描述】主从模型序列化器</br> 【特别提醒】本序列化器中并没有学生信息,但教师学生模型关联了教师模型,本例使用反查法,通过关系字段反查该教师在教师学生模型中的记录。 由于一个教师可能有多个学生,故查询结果是多条记录。因些必须加many=True,字段teacher_set必须和教师学生表中teacher中的关系字段一致。 """ teacher_set = TeacherAndStudentSerializer(read_only=True, many=True) class Meta: model = Teachers fields = '__all__' class SchoolsSerializer(serializers.ModelSerializer): """ 【功能描述】产从模型序列化器</br> 【特别提醒】本模型和教师模型一样,用反查法,通过教师模型中的关联字段teacher,反查教师模型中的其它字段。 """ teacher = TeacherSerializer(read_only=True, many=True) class Meta: model = Schools fields = '__all__' class TeacherMultiViewSet(ModelViewSet): queryset = Teachers.objects.all() serializer_class = TeacherSerializer class SchoolMultiTableViewSet(ModelViewSet): queryset = Schools.objects.all() serializer_class = SchoolsSerializer
2 增加一个路由
path('SchoolMultiTableViewSet/', SchoolMultiTableViewSet.as_view({'get': 'list'}))
3 运行工程,录入数据,测试效果。