B-04 Django-第二部分(熟练掌握)-模型(Model)设计-定义模型类(练习)

Django-第二部分(熟练掌握)-模型(Model)设计-定义模型类(练习)

目标

前面已经介绍了如何快速入门,现在开始熟练掌握一些知识

  • 掌握定义模型类

回顾

a、模型(Model)设计流程过程说明

第一步-配置使用数据库
第二步-定义模型类
第三步-迁移数据
第四步-访问使用数据

一、数据库表设计

为方便后续使用,先定义好一个数据库和表结构。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ie8dGe51-1575969920364)(en-resource://database/4187:1)]

二、定义单表的模型类

单表关系为 老师表(teacher), 年级表(grade)

class Teacher(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16, verbose_name="教师名称")
    
    class Meta:
        db_table = 't_teacher'  # 定义表名为t_teacher

    def __str__(self):
        # 默认显示类的name字段
        return self.name


class Grade(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16, verbose_name="年级名称")

    class Meta:
        db_table = 't_grade'

    def __str__(self):
        # 默认显示类的name字段
        return self.name

代码说明:

  • 相关字段作用可以参考前面讲解模型类字段使用

三、定义一对多的模型类

一对多关系为班级表(class)、学生表(student)、课程表(course)

class Class(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16, verbose_name="编辑名称")
    grade_id = models.ForeignKey(to='Grade', to_field='id', on_delete=models.CASCADE, db_column="grade_id")

    class Meta:
        db_table = 't_class'

    def __str__(self):
        # 默认显示类的name字段
        return self.name


class Student(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16, verbose_name="学生名称")
    GENDER_CHOICES = (
        (0, u"女"),
        (1, u"男"),
    )
    gender = models.CharField(max_length=4, verbose_name="性别", choices=GENDER_CHOICES)
    class_id = models.ForeignKey(to='Class', to_field='id', on_delete=models.CASCADE, db_column="class_id")

    class Meta:
        db_table = 't_student'

    def __str__(self):
        # 默认显示类的name字段
        return self.name


class Course(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16, verbose_name="课程名称")
    teacher_id = models.ForeignKey(to='Teacher', to_field='id', on_delete=models.CASCADE, db_column="teacher_id")

    class Meta:
        db_table = 't_course'

    def __str__(self):
        # 默认显示类的name字段
        return self.name

代码说明:

  • 处理一对多关系,主要使用 models.ForeignKey 来定义,想自己定义字段名称可以使用 选项参数db_column

四、定义多对多的模型类

多对多关系为老师执教班级表(teacher2cls)、成绩表(score)

class Teacher(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16, verbose_name="教师名称")
    class_id = models.ManyToManyField(to='Class', db_column="class_id", db_table="t_teach2cls")

    class Meta:
        db_table = 't_teacher'  # 定义表名为t_teacher

    def __str__(self):
        # 默认显示类的name字段
        return self.name

代码说明:

  • 由于是多对多关系,可定义在任意一段,我这里定义在Teacher中,使用 models.ManyToManyField 定义,由于希望指定多对多生成的表名使用 db_table="t_teach2cls" 参数进行指定。
class Student(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16, verbose_name="学生名称")
    GENDER_CHOICES = (
        (0, u"女"),
        (1, u"男"),
    )
    gender = models.CharField(max_length=4, verbose_name="性别", choices=GENDER_CHOICES)
    class_id = models.ForeignKey(to='Class', to_field='id', on_delete=models.CASCADE, db_column="class_id")
    course_id = models.ManyToManyField(to='Course', through='Score', through_fields=('student_id', 'course_id'),
                                       db_column="course_id")

    class Meta:
        db_table = 't_student'

    def __str__(self):
        # 默认显示类的name字段
        return self.name
        
        
class Score(models.Model):
    id = models.AutoField(primary_key=True)
    student_id = models.ForeignKey(verbose_name='学生', to="Student", to_field='id', on_delete=models.CASCADE,
                                   db_column="student_id")
    course_id = models.ForeignKey(verbose_name='课程', to="Course", to_field='id', on_delete=models.CASCADE,
                                  db_column="course_id")
    score = models.IntegerField(verbose_name="分数", default=0)

    class Meta:
        db_table = 't_score'
        unique_together = [('student_id', 'course_id'), ]

    def __str__(self):
        v = self.student_id.name + "---" + self.course_id.name
        return v

代码说明:

  • 由于是多对多关系,并且新增加了额外字段,需要使用一个新的类Score来定义新的表。同时在任意一段,使用 models.ManyToManyField 定义。但需要将其关联到新的类 course_id = models.ManyToManyField(to='Course', through='Score', through_fields=('student_id', 'course_id'), db_column="course_id")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值