Django基于ListAPIView、序列化器Serializer完成多表联合查数据

Django基于ListAPIView、序列化器Serializer完成多表联合查数据

1.表与表之间有直接的关系

  • 老师表与课程表

    class CourseModelSerializer(serializers.ModelSerializer):
        """展示课程详细信息+老师信息+课时信息的序列化器"""
        # 方式一 
        teacher_name = serializers.CharField(max_length=32, source='teacher.name')
        class Meta:
            model = models.Course
            fields = ["id", "name", "course_img", "students", "lessons", "pub_lessons", "price", 'teacher_name']
    
    • 这里之所以可以通过source直接关联老师的姓名,是因为课程与老师表有外键关系,因为课程表中是以老师表中的id做的外键,此时我们这样配置,取数据的时候就自动的将老师表中的老师姓名数据取了出来

在这里插入图片描述

  • 通过postman测试:

在这里插入图片描述

  • 但是这种方式每增加一个字段就得写一行,很是麻烦!

    class CourseModelSerializer(serializers.ModelSerializer):
        """展示课程详细信息+老师信息+课时信息的序列化器"""
        # 方式一
        teacher_name = serializers.CharField(max_length=32, source='teacher.name')
        teacher_title = serializers.CharField(max_length=32, source='teacher.title')
        .......
        
        class Meta:
            model = models.Course
            fields = ["id", "name", "course_img", "students", "lessons", "pub_lessons", "price", 'teacher_name', "teacher_title", ........]
    
    

2. 直接关系表解决方式二

  • 通过序列化器实例化对象的方式构建。将一个序列化器挂载到另一个序列化器里面

    class TeacherModelSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Teacher
            fields = ['name', 'title', 'signature']
    
    
    class CourseModelSerializer(serializers.ModelSerializer):
        """展示课程详细信息+老师信息+课时信息的序列化器"""
        # 课程对应老师是多对一,老师是一
        teacher = TeacherModelSerializer()
        # # 如果:老师对应课程是多对一,老师是多
        # teacher = TeacherModelSerializer(many=True)
        class Meta:
            model = models.Course
            fields = ["id", "name", "course_img", "students", "lessons", "pub_lessons", "price", 'teacher']
    
    • postman测试:
      在这里插入图片描述

前提条件:序列化器想要获取非指定的另一个表的数据,序列化器指定的表与另一张表一定存在间接关系,这样前端显示数据时,会根据关系进行对应的展示。

3、表与表之间间接关系取数据

  • 例如:

    课程表+章节表+具体的章节表 课程表课具体的章节表是间接关系

  • 此时我们给课程表course添加一个字段

        def lesson_list(self):
            chapter_list = self.coursechapters.filter(is_deleted=False, is_show=True)
            lesson_lists = []
            for chapter in chapter_list:
                lessons = chapter.coursesections.filter(is_deleted=False, is_show=True)
                for lesson in lessons:
                    lesson_lists.append(
                        {'id': lesson.id,
                         'name': lesson.name,
                         'lesson': lesson.lesson,
                         'free_trail': lesson.free_trail})
            return lesson_lists[:4]
    
  • 给lesson表增加三个字段:原因是因为我们当时建表时没有创建关联,如果建表时已经建好关联了就不用创建了

    course = models.ForeignKey('Course', related_name='course_lesson', verbose_name='课程', on_delete=models.CASCADE,
                                   null=True, blank=True)
        is_show_list = models.BooleanField(verbose_name='是否推荐到课程列表', default=False)
        lesson = models.IntegerField(verbose_name='第几课时', default=1)
    
  • 同步数据库指令。

    python manage.py makemigrations
    python manage.py migrate
    
  • 插入虚拟数据进行测试

    INSERT INTO `ly_course_chapter`(`id`,`orders`,`is_show`,`is_deleted`,`created_time`,`updated_time`,`chapter`,`name`,`summary`,`pub_date`,`course_id`)
    VALUES (1,1,1,0,'2019-08-13 07:24:21.889515','2019-08-13 07:24:21.889542',1,'flask框架快速入门','flask框架快速入门','2019-08-13',1),
    (2,2,1,0,'2019-08-13 07:24:37.116231','2019-08-15 03:59:17.598352',2,'flask的路由','flask的路由','2019-08-13',1),
    (3,3,1,0,'2019-08-13 07:24:51.153812','2019-08-15 03:59:22.067057',3,'flask的视图','flask的视图','2019-08-13',1),
    (4,4,1,0,'2019-08-13 07:25:00.621686','2019-08-15 03:59:29.642805',4,'flask的模型','flask的模型','2019-08-13',1),(5,5,1,0,'2019-08-13 07:24:21.889515','2019-08-13 07:24:21.889542',1,'django框架快速入门','django框架快速入门','2019-08-13',3),(6,6,1,0,'2019-08-13 07:24:37.116231','2019-08-13 07:24:37.116262',2,'django的路由','django的路由','2019-08-13',3),(7,7,1,0,'2019-08-13 07:24:51.153812','2019-08-13 07:24:51.153846',3,'django的视图','django的视图','2019-08-13',3),(8,8,1,0,'2019-08-13 07:25:00.621686','2019-08-13 07:25:00.621768',4,'django的模型','django的模型','2019-08-13',3);
    
    INSERT INTO `ly_course_lesson`
    (`id`,`is_show`,`is_deleted`,`created_time`,`updated_time`,`name`,`orders`,`section_type`,`section_link`,`duration`,`pub_date`,`free_trail`,`chapter_id`,`course_id`,`is_show_list`,`lesson`)
     VALUES
    (1,1,0,'2019-08-13 07:27:06.873098','2019-08-13 07:27:06.873149','flask基本介绍',1,0,'http://www.baidu.com','3:00','2019-08-13 07:27:06.873188',1,1,1,1,1),
    (2,1,0,'2019-08-13 07:27:27.408740','2019-08-13 07:27:27.408766','flask的优缺点',2,2,'http://www.baidu.com','3:30','2019-08-13 07:27:27.408798',1,1,1,0,2),
    (3,1,0,'2019-08-13 07:27:45.659948','2019-08-13 07:27:45.659980','flask的安装',3,2,'http://www.baidu.com','5:00','2019-08-13 07:27:45.660016',0,1,1,1,3),
    (13,1,0,'2019-08-13 07:27:06.873098','2019-08-13 07:27:06.873149','flask的项目搭建',4,2,'http://www.baidu.com','3:00','2019-08-13 07:27:06.873188',0,1,1,0,4),
    (14,1,0,'2019-08-13 07:27:27.408740','2019-08-13 07:27:27.408766','flask的项目基本目录结构',5,2,'http://www.baidu.com','3:30','2019-08-13 07:27:27.408798',0,1,1,1,5),
    (15,1,0,'2019-08-13 07:27:45.659948','2019-08-13 07:27:45.659980','flask的运行',6,2,'http://www.baidu.com','5:00','2019-08-13 07:27:45.660016',0,1,1,0,6),
    (16,1,0,'2019-08-13 07:27:06.873098','2019-08-26 12:57:10.455292','django基本介绍',1,2,'7ec57198590152fd3a647d73e218e385_7','14:00','2019-08-13 07:27:06.873188',1,5,3,1,1),
    (17,1,0,'2019-08-13 07:27:27.408740','2019-08-13 07:27:27.408766','django的优缺点',2,2,'http://www.baidu.com','3:30','2019-08-13 07:27:27.408798',1,5,3,0,2),
    (18,1,0,'2019-08-13 07:27:45.659948','2019-08-14 02:13:52.517392','django的安装',3,2,'http://www.baidu.com','5:00','2019-08-13 07:27:45.660016',1,5,3,1,3),
    (19,1,0,'2019-08-13 07:27:06.873098','2019-08-13 07:27:06.873149','django的项目搭建',4,2,'http://www.baidu.com','3:00','2019-08-13 07:27:06.873188',0,5,3,1,4),
    (20,1,0,'2019-08-13 07:27:27.408740','2019-08-13 07:27:27.408766','django的项目基本目录结构',5,2,'http://www.baidu.com','3:30','2019-08-13 07:27:27.408798',0,5,3,1,5),
    (21,1,0,'2019-08-13 07:27:45.659948','2019-08-13 07:27:45.659980','django的运行',6,2,'http://www.baidu.com','5:00','2019-08-13 07:27:45.660016',0,5,3,0,6),
    (22,1,0,'2019-08-15 03:50:02.221829','2019-08-15 03:50:29.325498','路由的分类-命名绑定参数',1,2,'http://www.baidu.com','16:00','2019-08-15 03:50:02.221897',0,2,1,1,1);
    
  • postman测试:

在这里插入图片描述

  • 此时我们的序列化器配置如下,我们直接将刚才新加的字段展示即可

    class CourseModelSerializer(serializers.ModelSerializer):
        """展示课程详细信息的序列化器"""
        # teacher_name=serializers.CharField(max_length=32,source='teacher.name')
        teacher=TeacherModelSerialzer()
        class Meta:
            model = models.Course
            fields = ["id", "name", "course_img", "students", "lessons", "pub_lessons", "price",'teacher','lesson_list']
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值