0016 基于DRF框架开发(多表接口的实现)

  我们之前创建了四个模型,学校模型,教师模型,学生模型,教师学生模型。其关系如下:

  学校和教师是一对多,学校和学生也是一对多,而教师和学生是多对多。

  现在,我们需要一个学校列表 ,同时显示每个学校的所有教师,和每个教师教的所有学生。

  理一下思路,大致分为以下几步:

  1 学校模型找教师模型:通过教师模型中与学校关联的字段进行反查

  2 教师找教师学生模型:通过教师学生模型中与教师关联的字段进行反查

  3 教师学生模型找学生:通过教师学生模型中与学生关联的字段进行顺查

  于是,代码实现的思路如下:

  1 建立学生序列化器

  2 建立教师学生序列化器,在该序列化器中引入学生序列化信息

  3 建立教师序列化器,在该序列化器中引入教师学生序列化信息

扫描二维码关注公众号,回复: 9468687 查看本文章

  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'}))

猜你喜欢

转载自www.cnblogs.com/dorian/p/12378626.html
今日推荐