zoukankan      html  css  js  c++  java
  • Django中实现单表和多表接口

    基础接口

    序列化:course/serializers.py
    from rest_framework import serializers
    from .models import CourseCategory, Course, Teacher
    
    class CourseCategorySerializer(serializers.ModelSerializer):
        class Meta:
            model = CourseCategory
            fields = ["id","name"]
    
    class TeacherSerializer(serializers.ModelSerializer):
        """课程列表的老师信息"""
        class Meta:
            model = Teacher
            fields = ["id", "name", "role", "title", "signature", "brief", "image"]
    
    class CourseSerializer(serializers.ModelSerializer):
        """课程列表的课程基本信息"""
        # 序列化器嵌套[被嵌套的序列化器必须声明对应的字段为模型原有的外键字段,同时这个被嵌套的序列化器必须先声明才能进行调用!]
        # 如果嵌套的序列化器数据有多条,则需要在调用序列化器时需要声明 many=True
        teacher = TeacherSerializer()
        class Meta:
            model = Course
            fields = ["id", "name", "course_img", "students", "sections", "pub_sections", "price", "teacher", 'section_list]
    
    视图:course/views.py
    from rest_framework.generics import ListAPIView
    from .models import CourseCategory, Course
    from .serializers import CourseCategorySerializer, CourseSerializer
    class CourseCategoryAPIView(ListAPIView):
        """课程分类列表接口"""
        queryset = CourseCategory.objects.filter(is_delete=False,is_show=True).order_by("orders")
        serializer_class = CourseCategorySerializer
    
    class CourseAPIView(ListAPIView):
        """课程列表接口"""
        queryset = Course.objects.filter(is_delete=False, is_show=True).order_by("orders")
        serializer_class = CourseSerializer
    
    路由:course/urls.py
    from django.urls import path,re_path
    from . import views
    urlpatterns = [
        path("", views.CourseAPIView.as_view()),
        path("category/", views.CourseCategoryAPIView.as_view()),
    ]
    
    接口
    http://127.0.0.1:8000/course/
    http://127.0.0.1:8000/course/category/
    

    连表接口

    模型演变:course/models.py
    class Course(BaseModel):
        """课程"""
        course_type = (
            (0, '付费'),
            (1, 'VIP专享'),
            (2, '学位课程')
        )
        level_choices = (
            (0, '初级'),
            (1, '中级'),
            (2, '高级'),
        )
        status_choices = (
            (0, '上线'),
            (1, '下线'),
            (2, '预上线'),
        )
        name = models.CharField(max_length=128, verbose_name="课程名称")
        course_img = models.ImageField(upload_to="course", max_length=255, verbose_name="封面图片", blank=True, null=True)
        course_type = models.SmallIntegerField(choices=course_type, default=0, verbose_name="付费类型")
        # 使用这个字段的原因
        brief = models.TextField(max_length=2048, verbose_name="详情介绍", null=True, blank=True)
        level = models.SmallIntegerField(choices=level_choices, default=0, verbose_name="难度等级")
        pub_date = models.DateField(verbose_name="发布日期", auto_now_add=True)
        period = models.IntegerField(verbose_name="建议学习周期(day)", default=7)
        attachment_path = models.FileField(upload_to="attachment", max_length=128, verbose_name="课件路径", blank=True,
                                           null=True)
        status = models.SmallIntegerField(choices=status_choices, default=0, verbose_name="课程状态")
        course_category = models.ForeignKey("CourseCategory", on_delete=models.SET_NULL, db_constraint=False, null=True, blank=True,
                                            verbose_name="课程分类")
        students = models.IntegerField(verbose_name="学习人数", default=0)
        lessons = models.IntegerField(verbose_name="总课时数量", default=0)
        pub_lessons = models.IntegerField(verbose_name="课时更新数量", default=0)
        price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name="课程原价", default=0)
        teacher = models.ForeignKey("Teacher", on_delete=models.DO_NOTHING, null=True, blank=True, verbose_name="授课老师")
    
        class Meta:
            db_table = "luffy_course"
            verbose_name = "课程"
            verbose_name_plural = "课程"
    
        def __str__(self):
            return "%s" % self.name
    
        @property
        def teacher_name(self):
            """返回老师姓名"""
            return self.teacher.name
    
        @property
        def section_list(self):
            """课程列表的推荐课时"""
            # 获取当前课程的所有章节
            coursechapter_list = self.coursechapters.filter(is_show=True, is_delete=False).order_by("orders")
            # 通过循环当前磕碜的所有章节,来获取章节下面的所有课时
            data_list = []
            for coursechapter in coursechapter_list:
                # 当前章节下的所有课时
                coursesection_list = coursechapter.coursesections.filter(is_show=True, is_delete=False).order_by("orders")
                # 循环每一个课时,逐个追加到data_list进行返回
                for coursesection in coursesection_list:
                    if len(data_list) >= 4:
                        break
                    data_list.append({
                        "id": coursesection.id,
                        "name": coursesection.name,
                        "free_trail": coursesection.free_trail,
                    })
    
            return data_list
    
    序列化演变:course/serializers.py
    class CourseSerializer(serializers.ModelSerializer):
        """课程列表的课程基本信息"""
        # 序列化器嵌套[被嵌套的序列化器必须声明对应的字段为模型原有的外键字段,同时这个被嵌套的序列化器必须先声明才能进行调用!]
        # 如果嵌套的序列化器数据有多条,则需要在调用序列化器时需要声明 many=True
        teacher = TeacherSerializer()
    
        class Meta:
            model = Course
            fields = ["id", "name", "course_img", "students", "sections", "pub_sections", "price", "teacher", 'section_list]
    
    
    
  • 相关阅读:
    20151224:Web:CheckBoxList 控件:去重显示 ;复选框多选时可点击查询查出结果
    20151223:Web:审核:审核和取消
    20151223:Web:审核:主页面
    20151223:Web:审核:登陆
    20151223:Web:审核:注册
    20151221:Web复习:删除
    练习!!年月日判断并输出第多少天
    枚举,函数
    练习!!输入学生信息
    结构体
  • 原文地址:https://www.cnblogs.com/ruhai/p/11311910.html
Copyright © 2011-2022 走看看