• 0024 DRF框架开发(11 多表查询的实现)


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

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

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

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

      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 运行工程,录入数据,测试效果。

      

      

      

  • 相关阅读:
    事务的隔离级别
    事务的隔离
    事务简介
    leetcode647
    leetcode394
    leetcode96
    leetcode814
    leetcode738
    leetcode621
    leetcode763
  • 原文地址:https://www.cnblogs.com/dorian/p/12378626.html
Copyright © 2020-2023  润新知