模型类中小知识点、关联字段、外键关联的好处与坏处、拿表关联字段

模型类中小知识点

blank:后台管理录入可以为空,
null:存到数据库字段可以为空,
max_digits:总位数(不包括小数点和符号),
decimal_places:小数位数,
auto_now_add = True用于创建时间,
auto_now = True用于更新时间,
help_text参数允许您为此Field指定说明性文本,
upload_to来指定文件存放的前缀路径,
related_name='coursechapters'    反向操作时,使用的字段名,用于代替原反向查询时的’表名_set’,
related_query_name='字符串'    反向查询操作时,使用的连接前缀,用于替换表名,
__ 连表查询 : __表名小写__     __字符串__,

关联字段

# 关联字段
    ForeignKey的on_delete的选择:
        models.CASCADE    级联删除,用的少,除非真的要删除
        models.SET_NULL   关联字段设为空   null=True
        models.SET_DEFAULT 关联字段设为默认值 defalut='asfasd'
        models.DO_NOTHING  什么都不做, 不用强外键关联
        models.SET()       放一个函数内存地址,关联字段删除时,执行这个函数

外键关联的好处与坏处

# 外键关联的好处和坏处
    好处在于 插入修改数据,有校验,能够保证数据不会错乱,不会出现脏数据
    坏处在于 有校验,速度慢,数量越大,越慢,咱们可以通过程序控制不加入脏数据
    公司内部为了效率,一般不建立外键关联,关系在 ,只是没有那条线了

    在django中不建立外键关联,只是不创建外键,关联关系还在【关联查询】,也是使用ForeignKey,只是加一个参数,加了之后,没有约束,但你们关系还在。

拿表关联字段

'''有三种方式:'''

class CourseSerializer(serializers.ModelSerializer):  # 课程列表和课程详情都用这个序列化类,序列化的字段多了好几个
    # 方式三:子序列化:通过老师的序列化类来实现序列化
    teacher = TeacherSerializer()

    class Meta:
        model = Course
        # fields = ['id', 'name'] # 要序列化更多字段
        fields = [
            'id',
            'name',
            'course_img',
            'price',  # 课程价格
            'students',  # 学生数量
            'pub_sections',  # 发布了多少课时
            'sections',  # 总课时数量

            'brief',  # 课程介绍
            'attachment_path',  # 课程课件地址
            'period',  # 建议学习周期

            'course_type_name',  # 课程类型名字,表中没有这个字段,表模型中重写方法
            'level_name',  # 级别名字
            'status_name',  # 状态名字

            # 'teacher_detail',  # 老师  {name:xx,title:xxx}
            'teacher',
            'section_list',  # 课时 最多4个课时 [{},{},{},{}]
        ]

方式一:在表模型中写
        # 序列化的字段方法
    def course_type_name(self):
        return self.get_course_type_display()

    def level_name(self):
        return self.get_level_display()

    def status_name(self):
        return self.get_status_display()

    # 序列化teacher的方法
    # def teacher_detail(self):
    #     return {'name': self.teacher.name}

    def section_list(self):
        section_list = []
        # 先根据课程取出所有章节,
        course_chapter_list = self.coursechapters.all()
        # 循环每个章节,取出所有课时
        for chapter in course_chapter_list:
            # 拿到该章节所有课时
            course_section_list = chapter.coursesections.all()
        # 拼接到列表中,当列表长度等于四,就结束
            for section in course_section_list:
                section_list.append({
                    'id':section.id,
                    'name':section.name,
                    'section_link':section.section_link,
                    'duration':section.duration,
                    'free_trail':section.free_trail
                })
                # 当列表长度等于四,就结束
                if len(section_list) >= 4:
                    return section_list
方式二:序列化类中写
    teacher = serializers.SerializerMethodField()
    def get_teacher(self, obj):
        return {'name': obj.teacher.name, 'title': obj.teacher.title, 'image': str(obj.teacher.image)}
方式三:子序列化:通过老师的序列化类来实现序列化
class TeacherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Teacher
        # fields = '__all__'
        fields = ['id', 'name', 'role', 'title', 'signature', 'image', 'brief']
        
class CourseSerializer(serializers.ModelSerializer): 
    # 方式三:子序列化:通过老师的序列化类来实现序列化
    teacher = TeacherSerializer()

    class Meta:
        model = Course
        fields = [
            ...
        ] 

posted @ 2022-11-17 19:11  张张包~  阅读(45)  评论(0编辑  收藏  举报