美文网首页
python编写数据库表关系

python编写数据库表关系

作者: 生命有一种执着 | 来源:发表于2020-06-30 17:49 被阅读0次
    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            |
    +----------------------------+
    
    
    
    这样,我们表关系的具体流程就搞定了!
    

    相关文章

      网友评论

          本文标题:python编写数据库表关系

          本文链接:https://www.haomeiwen.com/subject/oegxqktx.html