python编写数据库表关系

image.png

表关系(一对一,一对多,多对多)

from django.db import models

# Create your models here.

"""
学生表
包含属性:
    姓名、年龄、性别、QQ、电话、创建时间
"""
class Student(models.Model):
    name = models.CharField("姓名",max_length=20)#姓名属性,并指定长度
    age = models.SmallIntegerField("年龄",null=True)#年龄,可以为空
    sex = models.SmallIntegerField("性别",default=1)#性别,默认为1(1表示男)
    QQ = models.CharField("QQ号码",max_length=20,unique=True)#QQ号码,指定长度,并设置唯一
    phone = models.CharField("电话号码",max_length=20,unique=True)#电话号码,指定长度,并设置唯一
    c_time = models.DateTimeField("创建时间",auto_now_add=True)

    """
    将学生表与学生详情表关联起来
    定义detail,使用models.OneToOneField关联StudentDetail表,实现学生表与学生详情表成一对一关联,
    也可以在学生表中写;
    on_delete=models.SET_NULL表示当我的学生详情不存在时,学生表表可以存在,但详情为空
    与下面的一对一二选一
    """
    # detail = models.OneToOneField("StudentDetail",on_delete=models.SET_NULL,null=True)

    """
    将学生表与班级表关联起来
    定义grade,使用models.ForeignKey关联Grade表,实现班级表与学生表成一对多关联,
    on_delete=models.SET_NULL表示当班级不存在时,学生表可以存在,但详情为空
    """
    grade = models.ForeignKey("Grade",on_delete=models.SET_NULL,null=True)

    def __str__(self):
        return "{}-{}".format(self.name,self.age)
"""
学生详情表
包含属性:
    学院
学生详情表与学生表成一对一关系
"""
class StudentDetail(models.Model):
    college = models.CharField("学院",max_length=20)#学院属性,并指定长度
    """
    将学生表与学生详情表关联起来
    定义student,使用models.OneToOneField关联Student表,实现学生表与学生详情表成一对一关联,
    也可以在学生表中写;
    on_delete=models.CASCADE表示当我的学生不存在时,详情表也不能存在,
    
    """
    student = models.OneToOneField("Student",on_delete=models.CASCADE)

"""
班级表
包含属性:
    班级名称、班期
班级表与学生表成一对多关系
"""
class Grade(models.Model):
    name = models.CharField("班级名称",max_length=20)
    num = models.CharField("班期",max_length=20)

"""
课程表
包含属性:
    名称、
与学生表是多对多关系
"""
class Course(models.Model):
    name = models.CharField("课程名称",max_length=20)
    """
    关联学生表,生成迁移的时候自动生成一个中间表
    
    回滚:有的时候我们不需要它自定义的中间表,我们想用自己写的中间表,这时候在进行多对多的时候,
    我们在做迁移的时候先将多对多的表注释,然后在取消注释,再次进行迁移,迁移后在进行回滚:
    python manage.py migrate 0001
    在回滚后要将之前第二次迁移生成的0002文件删除
    之后我们就可以写中间表了
    through="Enroll":表示在创建好 多对多关系的时候,要指明两张多对多的表是通过Enroll中间表挂钩的
    这也是多对多的表与其他关系表不一样的地方
    
    """
    students = models.ManyToManyField("Student",through="Enroll")

"""
中间表
包含属性:
    必须有另外两张表对应起来,添加student,course的属性
    再添加自定义的属性,pay(钱),报名时间:c_time
"""
class Enroll(models.Model):
    """
    对与中间表来说,中间表是连接多对多的桥梁,与另外两张表是一对多的关系,并且一边不存在,那么中间表也将不存在

    """
    student = models.ForeignKey("Student",on_delete=models.CASCADE)
    course = models.ForeignKey("Course",on_delete=models.CASCADE)
    pay = models.FloatField("缴费金额",default=0)
    c_time = models.DateTimeField("报名时间",auto_now_add=True)

查看数据库中已完成的表

mysql> show tables;
+----------------------------+
| Tables_in_BasketBall       |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| students_course            |
| students_enroll            |
| students_grade             |
| students_student           |
| students_studentdetail     |
| teacher_student            |
+----------------------------+



这样,我们表关系的具体流程就搞定了!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容