叶觉的Django之旅【07-绕不开的表关系】

表关系

表关系,即表与表之间的关系。两表之间的表关系是相对的。
设表A与表B存在,则有以下三种关系:

  • 一对多关系
    如果表A中存在一条数据,对应表B中多条数据,则说A表与B表有一对多关系,反之B表与A表有多对一关系。如学院与学生,一个学院可以有多个学生,而一个学生同一时间只能有一个学院。
  • 一对一关系
    如果表A中存在一条数据,对应且只能对应表B中的一条数据,则说两个表互成一对一关系。如,学生与档案,每一个学生只有一个档案,每一个档案也只属于一个学生。
  • 多对多关系
    如果表A中存在多条数据分别与表B的多条数据有对应关系,则称这种关系为多对多关系,相应的,表B中也存在多条数据分别与表A的多条数据对应。多对多关系的成立,必须有一个中间表来存放两个独立表之间的对应关系,使用两个表的主键作为外键联合主键。

表关系的模型

在这里插入图片描述

  • 使用五个表来描述表关系,其中
    • 学院表与学生表成一对多关系
    • 学生表与学生详情表成一对一关系
    • 学生与课程表成多对多关系
    • 在django中,中间表不需要自己创建
    • on_delete=models.CASCADE,用以表示级联删除
# 学院表
class College(models.Model):
    c_id = models.AutoField(primary_key=True)
    college_name = models.CharField(max_length=30)


# 学生表
class Student(models.Model):
    s_id = models.IntegerField(primary_key=True)
    student_name = models.CharField(max_length=20)
    c_id = models.ForeignKey(College, on_delete=models.CASCADE)


# 学生详情表
class StudentDetail(models.Model):
    sd_id = models.AutoField(primary_key=True)
    student_age = models.IntegerField()
    student_phone = models.IntegerField()
    student = models.OneToOneField(Student, on_delete=models.CASCADE)


# 课程表
class Course(models.Model):
    co_id = models.AutoField(primary_key=True)
    course_name = models.CharField(max_length=30)
    student = models.ManyToManyField(Student)
发布了24 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39177678/article/details/103574206